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