gitscope
https://dev.kronoz.win/r/marzneshin.git
app/marznode/operations.py · v0.3.0
Source
1 49457ba Dawsh 2y ago import asyncio
2 12b255b Dawsh 2y ago from collections import defaultdict
3 12b255b Dawsh 2y ago from typing import TYPE_CHECKING
4 12b255b Dawsh 2y ago
5 12b255b Dawsh 2y ago from app import marznode
6 8372786 Dawsh 2y ago from .grpcio import MarzNodeGRPCIO
7 8372786 Dawsh 2y ago from .grpclib import MarzNodeGRPCLIB
8 f6a32ea Dawsh 2y ago from ..models.node import NodeConnectionBackend
9 f6a32ea Dawsh 2y ago from ..models.user import UserStatus
10 12b255b Dawsh 2y ago
11 12b255b Dawsh 2y ago if TYPE_CHECKING:
12 12b255b Dawsh 2y ago from app.db import User as DBUser
13 12b255b Dawsh 2y ago
14 12b255b Dawsh 2y ago
15 f6a32ea Dawsh 2y ago async def update_user(user: "DBUser", old_inbounds: set | None = None):
16 f6a32ea Dawsh 2y ago """updates a user on all nodes
17 f6a32ea Dawsh 2y ago even though this isn't efficient it is extremely precise"""
18 f6a32ea Dawsh 2y ago if old_inbounds is None:
19 f6a32ea Dawsh 2y ago old_inbounds = set()
20 34a7612 Dawsh 2y ago
21 f6a32ea Dawsh 2y ago node_inbounds = defaultdict(list)
22 f6a32ea Dawsh 2y ago if user.status in (UserStatus.on_hold, UserStatus.active):
23 f6a32ea Dawsh 2y ago for inb in user.inbounds:
24 f6a32ea Dawsh 2y ago node_inbounds[inb.node_id].append(inb.tag)
25 f6a32ea Dawsh 2y ago else:
26 f6a32ea Dawsh 2y ago for inb in user.inbounds:
27 f6a32ea Dawsh 2y ago node_inbounds[inb.node_id]
28 12b255b Dawsh 2y ago
29 f6a32ea Dawsh 2y ago for inb in old_inbounds:
30 f6a32ea Dawsh 2y ago node_inbounds[inb[0]]
31 12b255b Dawsh 2y ago
32 f6a32ea Dawsh 2y ago for node_id, tags in node_inbounds.items():
33 d6e2aad Dawsh 2y ago if marznode.nodes.get(node_id):
34 49457ba Dawsh 2y ago asyncio.create_task(
35 49457ba Dawsh 2y ago marznode.nodes[node_id].update_user(user=user, inbounds=tags)
36 49457ba Dawsh 2y ago )
37 d6e2aad Dawsh 2y ago
38 d6e2aad Dawsh 2y ago
39 d6e2aad Dawsh 2y ago async def remove_user(user: "DBUser"):
40 c7e6427 Dawsh 2y ago node_ids = set(inb.node_id for inb in user.inbounds)
41 d6e2aad Dawsh 2y ago
42 d6e2aad Dawsh 2y ago for node_id in node_ids:
43 d6e2aad Dawsh 2y ago if marznode.nodes.get(node_id):
44 d6e2aad Dawsh 2y ago await marznode.nodes[node_id].update_user(user=user, inbounds=[])
45 12b255b Dawsh 2y ago
46 12b255b Dawsh 2y ago
47 12b255b Dawsh 2y ago async def remove_node(node_id: int):
48 12b255b Dawsh 2y ago if node_id in marznode.nodes:
49 12b255b Dawsh 2y ago del marznode.nodes[node_id]
50 12b255b Dawsh 2y ago
51 12b255b Dawsh 2y ago
52 f6a32ea Dawsh 2y ago async def add_node(db_node, certificate):
53 f6a32ea Dawsh 2y ago await remove_node(db_node.id)
54 f6a32ea Dawsh 2y ago if db_node.connection_backend == NodeConnectionBackend.grpcio:
55 49457ba Dawsh 2y ago node = MarzNodeGRPCIO(
56 49457ba Dawsh 2y ago db_node.id,
57 49457ba Dawsh 2y ago db_node.address,
58 49457ba Dawsh 2y ago db_node.port,
59 49457ba Dawsh 2y ago usage_coefficient=db_node.usage_coefficient,
60 49457ba Dawsh 2y ago )
61 f6a32ea Dawsh 2y ago else:
62 01cdf2e Dawsh 2y ago node = MarzNodeGRPCLIB(
63 01cdf2e Dawsh 2y ago db_node.id,
64 01cdf2e Dawsh 2y ago db_node.address,
65 01cdf2e Dawsh 2y ago db_node.port,
66 01cdf2e Dawsh 2y ago certificate.key,
67 01cdf2e Dawsh 2y ago certificate.certificate,
68 49457ba Dawsh 2y ago usage_coefficient=db_node.usage_coefficient,
69 01cdf2e Dawsh 2y ago )
70 f6a32ea Dawsh 2y ago marznode.nodes[db_node.id] = node
71 12b255b Dawsh 2y ago
72 12b255b Dawsh 2y ago
73 01cdf2e Dawsh 2y ago __all__ = ["update_user", "add_node", "remove_node"]