Karma commited on
Commit
91e68d4
·
1 Parent(s): e0f20b4

Create feds_sql.py

Browse files
Files changed (1) hide show
  1. Database/sql/feds_sql.py +931 -0
Database/sql/feds_sql.py ADDED
@@ -0,0 +1,931 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import ast
2
+ import threading
3
+
4
+ from sqlalchemy import BigInteger, Boolean, Column, Integer, String, UnicodeText
5
+ from telegram.error import BadRequest, Forbidden
6
+
7
+ from Database.sql import BASE, SESSION
8
+ from Mikobot import dispatcher
9
+
10
+
11
+ class Federations(BASE):
12
+ __tablename__ = "feds"
13
+ owner_id = Column(String(14))
14
+ fed_name = Column(UnicodeText)
15
+ fed_id = Column(UnicodeText, primary_key=True)
16
+ fed_rules = Column(UnicodeText)
17
+ fed_log = Column(UnicodeText)
18
+ fed_users = Column(UnicodeText)
19
+
20
+ def __init__(self, owner_id, fed_name, fed_id, fed_rules, fed_log, fed_users):
21
+ self.owner_id = owner_id
22
+ self.fed_name = fed_name
23
+ self.fed_id = fed_id
24
+ self.fed_rules = fed_rules
25
+ self.fed_log = fed_log
26
+ self.fed_users = fed_users
27
+
28
+
29
+ class ChatF(BASE):
30
+ __tablename__ = "chat_feds"
31
+ chat_id = Column(String(14), primary_key=True)
32
+ chat_name = Column(UnicodeText)
33
+ fed_id = Column(UnicodeText)
34
+
35
+ def __init__(self, chat_id, chat_name, fed_id):
36
+ self.chat_id = chat_id
37
+ self.chat_name = chat_name
38
+ self.fed_id = fed_id
39
+
40
+
41
+ class BansF(BASE):
42
+ __tablename__ = "bans_feds"
43
+ fed_id = Column(UnicodeText, primary_key=True)
44
+ user_id = Column(String(14), primary_key=True)
45
+ first_name = Column(UnicodeText, nullable=False)
46
+ last_name = Column(UnicodeText)
47
+ user_name = Column(UnicodeText)
48
+ reason = Column(UnicodeText, default="")
49
+ time = Column(Integer, default=0)
50
+
51
+ def __init__(self, fed_id, user_id, first_name, last_name, user_name, reason, time):
52
+ self.fed_id = fed_id
53
+ self.user_id = user_id
54
+ self.first_name = first_name
55
+ self.last_name = last_name
56
+ self.user_name = user_name
57
+ self.reason = reason
58
+ self.time = time
59
+
60
+
61
+ class FedsUserSettings(BASE):
62
+ __tablename__ = "feds_settings"
63
+ user_id = Column(BigInteger, primary_key=True)
64
+ should_report = Column(Boolean, default=True)
65
+
66
+ def __init__(self, user_id):
67
+ self.user_id = user_id
68
+
69
+ def __repr__(self):
70
+ return "<Feds report settings ({})>".format(self.user_id)
71
+
72
+
73
+ class FedSubs(BASE):
74
+ __tablename__ = "feds_subs"
75
+ fed_id = Column(UnicodeText, primary_key=True)
76
+ fed_subs = Column(UnicodeText, primary_key=True, nullable=False)
77
+
78
+ def __init__(self, fed_id, fed_subs):
79
+ self.fed_id = fed_id
80
+ self.fed_subs = fed_subs
81
+
82
+ def __repr__(self):
83
+ return "<Fed {} subscribes for {}>".format(self.fed_id, self.fed_subs)
84
+
85
+
86
+ # Dropping db
87
+ # Federations.__table__.drop()
88
+ # ChatF.__table__.drop()
89
+ # BansF.__table__.drop()
90
+ # FedSubs.__table__.drop()
91
+
92
+ Federations.__table__.create(checkfirst=True)
93
+ ChatF.__table__.create(checkfirst=True)
94
+ BansF.__table__.create(checkfirst=True)
95
+ FedsUserSettings.__table__.create(checkfirst=True)
96
+ FedSubs.__table__.create(checkfirst=True)
97
+
98
+ FEDS_LOCK = threading.RLock()
99
+ CHAT_FEDS_LOCK = threading.RLock()
100
+ FEDS_SETTINGS_LOCK = threading.RLock()
101
+ FEDS_SUBSCRIBER_LOCK = threading.RLock()
102
+
103
+ FEDERATION_BYNAME = {}
104
+ FEDERATION_BYOWNER = {}
105
+ FEDERATION_BYFEDID = {}
106
+
107
+ FEDERATION_CHATS = {}
108
+ FEDERATION_CHATS_BYID = {}
109
+
110
+ FEDERATION_BANNED_FULL = {}
111
+ FEDERATION_BANNED_USERID = {}
112
+
113
+ FEDERATION_NOTIFICATION = {}
114
+ FEDS_SUBSCRIBER = {}
115
+ MYFEDS_SUBSCRIBER = {}
116
+
117
+
118
+ def get_fed_info(fed_id):
119
+ get = FEDERATION_BYFEDID.get(str(fed_id))
120
+ if get is None:
121
+ return False
122
+ return get
123
+
124
+
125
+ def get_fed_id(chat_id):
126
+ get = FEDERATION_CHATS.get(str(chat_id))
127
+ if get is None:
128
+ return False
129
+ else:
130
+ return get["fid"]
131
+
132
+
133
+ def get_fed_name(chat_id):
134
+ get = FEDERATION_CHATS.get(str(chat_id))
135
+ if get is None:
136
+ return False
137
+ else:
138
+ return get["chat_name"]
139
+
140
+
141
+ def get_user_fban(fed_id, user_id):
142
+ if not FEDERATION_BANNED_FULL.get(fed_id):
143
+ return False, False, False
144
+ user_info = FEDERATION_BANNED_FULL[fed_id].get(user_id)
145
+ if not user_info:
146
+ return None, None, None
147
+ return user_info["first_name"], user_info["reason"], user_info["time"]
148
+
149
+
150
+ def get_user_admin_fed_name(user_id):
151
+ user_feds = []
152
+ for f in FEDERATION_BYFEDID:
153
+ if int(user_id) in ast.literal_eval(
154
+ ast.literal_eval(FEDERATION_BYFEDID[f]["fusers"])["members"]
155
+ ):
156
+ user_feds.append(FEDERATION_BYFEDID[f]["fname"])
157
+ return user_feds
158
+
159
+
160
+ def get_user_owner_fed_name(user_id):
161
+ user_feds = []
162
+ for f in FEDERATION_BYFEDID:
163
+ if int(user_id) == int(
164
+ ast.literal_eval(FEDERATION_BYFEDID[f]["fusers"])["owner"]
165
+ ):
166
+ user_feds.append(FEDERATION_BYFEDID[f]["fname"])
167
+ return user_feds
168
+
169
+
170
+ def get_user_admin_fed_full(user_id):
171
+ user_feds = []
172
+ for f in FEDERATION_BYFEDID:
173
+ if int(user_id) in ast.literal_eval(
174
+ ast.literal_eval(FEDERATION_BYFEDID[f]["fusers"])["members"]
175
+ ):
176
+ user_feds.append({"fed_id": f, "fed": FEDERATION_BYFEDID[f]})
177
+ return user_feds
178
+
179
+
180
+ def get_user_owner_fed_full(user_id):
181
+ user_feds = []
182
+ for f in FEDERATION_BYFEDID:
183
+ if int(user_id) == int(
184
+ ast.literal_eval(FEDERATION_BYFEDID[f]["fusers"])["owner"]
185
+ ):
186
+ user_feds.append({"fed_id": f, "fed": FEDERATION_BYFEDID[f]})
187
+ return user_feds
188
+
189
+
190
+ def get_user_fbanlist(user_id):
191
+ banlist = FEDERATION_BANNED_FULL
192
+ user_name = ""
193
+ fedname = []
194
+ for x in banlist:
195
+ if banlist[x].get(user_id):
196
+ if user_name == "":
197
+ user_name = banlist[x][user_id].get("first_name")
198
+ fedname.append([x, banlist[x][user_id].get("reason")])
199
+ return user_name, fedname
200
+
201
+
202
+ def new_fed(owner_id, fed_name, fed_id):
203
+ with FEDS_LOCK:
204
+ global FEDERATION_BYOWNER, FEDERATION_BYFEDID, FEDERATION_BYNAME
205
+ fed = Federations(
206
+ str(owner_id),
207
+ fed_name,
208
+ str(fed_id),
209
+ "Rules is not set in this federation.",
210
+ None,
211
+ str({"owner": str(owner_id), "members": "[]"}),
212
+ )
213
+ SESSION.add(fed)
214
+ SESSION.commit()
215
+ FEDERATION_BYOWNER[str(owner_id)] = {
216
+ "fid": str(fed_id),
217
+ "fname": fed_name,
218
+ "frules": "Rules is not set in this federation.",
219
+ "flog": None,
220
+ "fusers": str({"owner": str(owner_id), "members": "[]"}),
221
+ }
222
+ FEDERATION_BYFEDID[str(fed_id)] = {
223
+ "owner": str(owner_id),
224
+ "fname": fed_name,
225
+ "frules": "Rules is not set in this federation.",
226
+ "flog": None,
227
+ "fusers": str({"owner": str(owner_id), "members": "[]"}),
228
+ }
229
+ FEDERATION_BYNAME[fed_name] = {
230
+ "fid": str(fed_id),
231
+ "owner": str(owner_id),
232
+ "frules": "Rules is not set in this federation.",
233
+ "flog": None,
234
+ "fusers": str({"owner": str(owner_id), "members": "[]"}),
235
+ }
236
+ return fed
237
+
238
+
239
+ def del_fed(fed_id):
240
+ with FEDS_LOCK:
241
+ global FEDERATION_BYOWNER, FEDERATION_BYFEDID, FEDERATION_BYNAME, FEDERATION_CHATS, FEDERATION_CHATS_BYID, FEDERATION_BANNED_USERID, FEDERATION_BANNED_FULL
242
+ getcache = FEDERATION_BYFEDID.get(fed_id)
243
+ if getcache is None:
244
+ return False
245
+ # Variables
246
+ getfed = FEDERATION_BYFEDID.get(fed_id)
247
+ owner_id = getfed["owner"]
248
+ fed_name = getfed["fname"]
249
+ # Delete from cache
250
+ FEDERATION_BYOWNER.pop(owner_id)
251
+ FEDERATION_BYFEDID.pop(fed_id)
252
+ FEDERATION_BYNAME.pop(fed_name)
253
+ if FEDERATION_CHATS_BYID.get(fed_id):
254
+ for x in FEDERATION_CHATS_BYID[fed_id]:
255
+ delchats = SESSION.query(ChatF).get(str(x))
256
+ if delchats:
257
+ SESSION.delete(delchats)
258
+ SESSION.commit()
259
+ FEDERATION_CHATS.pop(x)
260
+ FEDERATION_CHATS_BYID.pop(fed_id)
261
+ # Delete fedban users
262
+ getall = FEDERATION_BANNED_USERID.get(fed_id)
263
+ if getall:
264
+ for x in getall:
265
+ banlist = SESSION.query(BansF).get((fed_id, str(x)))
266
+ if banlist:
267
+ SESSION.delete(banlist)
268
+ SESSION.commit()
269
+ if FEDERATION_BANNED_USERID.get(fed_id):
270
+ FEDERATION_BANNED_USERID.pop(fed_id)
271
+ if FEDERATION_BANNED_FULL.get(fed_id):
272
+ FEDERATION_BANNED_FULL.pop(fed_id)
273
+ # Delete fedsubs
274
+ getall = MYFEDS_SUBSCRIBER.get(fed_id)
275
+ if getall:
276
+ for x in getall:
277
+ getsubs = SESSION.query(FedSubs).get((fed_id, str(x)))
278
+ if getsubs:
279
+ SESSION.delete(getsubs)
280
+ SESSION.commit()
281
+ if FEDS_SUBSCRIBER.get(fed_id):
282
+ FEDS_SUBSCRIBER.pop(fed_id)
283
+ if MYFEDS_SUBSCRIBER.get(fed_id):
284
+ MYFEDS_SUBSCRIBER.pop(fed_id)
285
+ # Delete from database
286
+ curr = SESSION.query(Federations).get(fed_id)
287
+ if curr:
288
+ SESSION.delete(curr)
289
+ SESSION.commit()
290
+ return True
291
+
292
+
293
+ def rename_fed(fed_id, owner_id, newname):
294
+ with FEDS_LOCK:
295
+ global FEDERATION_BYFEDID, FEDERATION_BYOWNER, FEDERATION_BYNAME
296
+ fed = SESSION.query(Federations).get(fed_id)
297
+ if not fed:
298
+ return False
299
+ fed.fed_name = newname
300
+ SESSION.commit()
301
+
302
+ # Update the dicts
303
+ oldname = FEDERATION_BYFEDID[str(fed_id)]["fname"]
304
+ tempdata = FEDERATION_BYNAME[oldname]
305
+ FEDERATION_BYNAME.pop(oldname)
306
+
307
+ FEDERATION_BYOWNER[str(owner_id)]["fname"] = newname
308
+ FEDERATION_BYFEDID[str(fed_id)]["fname"] = newname
309
+ FEDERATION_BYNAME[newname] = tempdata
310
+ return True
311
+
312
+
313
+ def chat_join_fed(fed_id, chat_name, chat_id):
314
+ with FEDS_LOCK:
315
+ global FEDERATION_CHATS, FEDERATION_CHATS_BYID
316
+ r = ChatF(chat_id, chat_name, fed_id)
317
+ SESSION.add(r)
318
+ FEDERATION_CHATS[str(chat_id)] = {"chat_name": chat_name, "fid": fed_id}
319
+ checkid = FEDERATION_CHATS_BYID.get(fed_id)
320
+ if checkid is None:
321
+ FEDERATION_CHATS_BYID[fed_id] = []
322
+ FEDERATION_CHATS_BYID[fed_id].append(str(chat_id))
323
+ SESSION.commit()
324
+ return r
325
+
326
+
327
+ def search_fed_by_name(fed_name):
328
+ allfed = FEDERATION_BYNAME.get(fed_name)
329
+ if allfed is None:
330
+ return False
331
+ return allfed
332
+
333
+
334
+ def search_user_in_fed(fed_id, user_id):
335
+ getfed = FEDERATION_BYFEDID.get(fed_id)
336
+ if getfed is None:
337
+ return False
338
+ getfed = ast.literal_eval(getfed["fusers"])["members"]
339
+ if user_id in ast.literal_eval(getfed):
340
+ return True
341
+ else:
342
+ return False
343
+
344
+
345
+ def user_demote_fed(fed_id, user_id):
346
+ with FEDS_LOCK:
347
+ global FEDERATION_BYOWNER, FEDERATION_BYFEDID, FEDERATION_BYNAME
348
+ # Variables
349
+ getfed = FEDERATION_BYFEDID.get(str(fed_id))
350
+ owner_id = getfed["owner"]
351
+ fed_name = getfed["fname"]
352
+ fed_rules = getfed["frules"]
353
+ fed_log = getfed["flog"]
354
+ # Temp set
355
+ try:
356
+ members = ast.literal_eval(ast.literal_eval(getfed["fusers"])["members"])
357
+ except ValueError:
358
+ return False
359
+ members.remove(user_id)
360
+ # Set user
361
+ FEDERATION_BYOWNER[str(owner_id)]["fusers"] = str(
362
+ {"owner": str(owner_id), "members": str(members)},
363
+ )
364
+ FEDERATION_BYFEDID[str(fed_id)]["fusers"] = str(
365
+ {"owner": str(owner_id), "members": str(members)},
366
+ )
367
+ FEDERATION_BYNAME[fed_name]["fusers"] = str(
368
+ {"owner": str(owner_id), "members": str(members)},
369
+ )
370
+ # Set on database
371
+ fed = Federations(
372
+ str(owner_id),
373
+ fed_name,
374
+ str(fed_id),
375
+ fed_rules,
376
+ fed_log,
377
+ str({"owner": str(owner_id), "members": str(members)}),
378
+ )
379
+ SESSION.merge(fed)
380
+ SESSION.commit()
381
+ return True
382
+
383
+ curr = SESSION.query(UserF).all()
384
+ result = False
385
+ for r in curr:
386
+ if int(r.user_id) == int(user_id):
387
+ if r.fed_id == fed_id:
388
+ SESSION.delete(r)
389
+ SESSION.commit()
390
+ result = True
391
+
392
+ SESSION.close()
393
+ return result
394
+
395
+
396
+ def user_join_fed(fed_id, user_id):
397
+ with FEDS_LOCK:
398
+ global FEDERATION_BYOWNER, FEDERATION_BYFEDID, FEDERATION_BYNAME
399
+ # Variables
400
+ getfed = FEDERATION_BYFEDID.get(str(fed_id))
401
+ owner_id = getfed["owner"]
402
+ fed_name = getfed["fname"]
403
+ fed_rules = getfed["frules"]
404
+ fed_log = getfed["flog"]
405
+ # Temp set
406
+ members = ast.literal_eval(ast.literal_eval(getfed["fusers"])["members"])
407
+ members.append(user_id)
408
+ # Set user
409
+ FEDERATION_BYOWNER[str(owner_id)]["fusers"] = str(
410
+ {"owner": str(owner_id), "members": str(members)},
411
+ )
412
+ FEDERATION_BYFEDID[str(fed_id)]["fusers"] = str(
413
+ {"owner": str(owner_id), "members": str(members)},
414
+ )
415
+ FEDERATION_BYNAME[fed_name]["fusers"] = str(
416
+ {"owner": str(owner_id), "members": str(members)},
417
+ )
418
+ # Set on database
419
+ fed = Federations(
420
+ str(owner_id),
421
+ fed_name,
422
+ str(fed_id),
423
+ fed_rules,
424
+ fed_log,
425
+ str({"owner": str(owner_id), "members": str(members)}),
426
+ )
427
+ SESSION.merge(fed)
428
+ SESSION.commit()
429
+ __load_all_feds_chats()
430
+ return True
431
+
432
+
433
+ def chat_leave_fed(chat_id):
434
+ with FEDS_LOCK:
435
+ global FEDERATION_CHATS, FEDERATION_CHATS_BYID
436
+ # Set variables
437
+ fed_info = FEDERATION_CHATS.get(str(chat_id))
438
+ if fed_info is None:
439
+ return False
440
+ fed_id = fed_info["fid"]
441
+ # Delete from cache
442
+ FEDERATION_CHATS.pop(str(chat_id))
443
+ FEDERATION_CHATS_BYID[str(fed_id)].remove(str(chat_id))
444
+ # Delete from db
445
+ curr = SESSION.query(ChatF).all()
446
+ for U in curr:
447
+ if int(U.chat_id) == int(chat_id):
448
+ SESSION.delete(U)
449
+ SESSION.commit()
450
+ return True
451
+
452
+
453
+ def all_fed_chats(fed_id):
454
+ with FEDS_LOCK:
455
+ getfed = FEDERATION_CHATS_BYID.get(fed_id)
456
+ if getfed is None:
457
+ return []
458
+ else:
459
+ return getfed
460
+
461
+
462
+ def all_fed_users(fed_id):
463
+ with FEDS_LOCK:
464
+ getfed = FEDERATION_BYFEDID.get(str(fed_id))
465
+ if getfed is None:
466
+ return False
467
+ fed_owner = ast.literal_eval(ast.literal_eval(getfed["fusers"])["owner"])
468
+ fed_admins = ast.literal_eval(ast.literal_eval(getfed["fusers"])["members"])
469
+ fed_admins.append(fed_owner)
470
+ return fed_admins
471
+
472
+
473
+ def all_fed_members(fed_id):
474
+ with FEDS_LOCK:
475
+ getfed = FEDERATION_BYFEDID.get(str(fed_id))
476
+ fed_admins = ast.literal_eval(ast.literal_eval(getfed["fusers"])["members"])
477
+ return fed_admins
478
+
479
+
480
+ def set_frules(fed_id, rules):
481
+ with FEDS_LOCK:
482
+ global FEDERATION_BYOWNER, FEDERATION_BYFEDID, FEDERATION_BYNAME
483
+ # Variables
484
+ getfed = FEDERATION_BYFEDID.get(str(fed_id))
485
+ owner_id = getfed["owner"]
486
+ fed_name = getfed["fname"]
487
+ fed_members = getfed["fusers"]
488
+ fed_rules = str(rules)
489
+ fed_log = getfed["flog"]
490
+ # Set user
491
+ FEDERATION_BYOWNER[str(owner_id)]["frules"] = fed_rules
492
+ FEDERATION_BYFEDID[str(fed_id)]["frules"] = fed_rules
493
+ FEDERATION_BYNAME[fed_name]["frules"] = fed_rules
494
+ # Set on database
495
+ fed = Federations(
496
+ str(owner_id),
497
+ fed_name,
498
+ str(fed_id),
499
+ fed_rules,
500
+ fed_log,
501
+ str(fed_members),
502
+ )
503
+ SESSION.merge(fed)
504
+ SESSION.commit()
505
+ return True
506
+
507
+
508
+ def get_frules(fed_id):
509
+ with FEDS_LOCK:
510
+ rules = FEDERATION_BYFEDID[str(fed_id)]["frules"]
511
+ return rules
512
+
513
+
514
+ def fban_user(fed_id, user_id, first_name, last_name, user_name, reason, time):
515
+ with FEDS_LOCK:
516
+ r = SESSION.query(BansF).all()
517
+ for I in r:
518
+ if I.fed_id == fed_id:
519
+ if int(I.user_id) == int(user_id):
520
+ SESSION.delete(I)
521
+
522
+ r = BansF(
523
+ str(fed_id),
524
+ str(user_id),
525
+ first_name,
526
+ last_name,
527
+ user_name,
528
+ reason,
529
+ time,
530
+ )
531
+
532
+ SESSION.add(r)
533
+ try:
534
+ SESSION.commit()
535
+ except:
536
+ SESSION.rollback()
537
+ return False
538
+ finally:
539
+ SESSION.commit()
540
+ __load_all_feds_banned()
541
+ return r
542
+
543
+
544
+ def multi_fban_user(
545
+ multi_fed_id,
546
+ multi_user_id,
547
+ multi_first_name,
548
+ multi_last_name,
549
+ multi_user_name,
550
+ multi_reason,
551
+ ):
552
+ if True: # with FEDS_LOCK:
553
+ counter = 0
554
+ time = 0
555
+ for x in range(len(multi_fed_id)):
556
+ fed_id = multi_fed_id[x]
557
+ user_id = multi_user_id[x]
558
+ first_name = multi_first_name[x]
559
+ last_name = multi_last_name[x]
560
+ user_name = multi_user_name[x]
561
+ reason = multi_reason[x]
562
+ r = SESSION.query(BansF).all()
563
+ for I in r:
564
+ if I.fed_id == fed_id:
565
+ if int(I.user_id) == int(user_id):
566
+ SESSION.delete(I)
567
+
568
+ r = BansF(
569
+ str(fed_id),
570
+ str(user_id),
571
+ first_name,
572
+ last_name,
573
+ user_name,
574
+ reason,
575
+ time,
576
+ )
577
+
578
+ SESSION.add(r)
579
+ counter += 1
580
+ try:
581
+ SESSION.commit()
582
+ except:
583
+ SESSION.rollback()
584
+ return False
585
+ finally:
586
+ SESSION.commit()
587
+ __load_all_feds_banned()
588
+ return counter
589
+
590
+
591
+ def un_fban_user(fed_id, user_id):
592
+ with FEDS_LOCK:
593
+ r = SESSION.query(BansF).all()
594
+ for I in r:
595
+ if I.fed_id == fed_id:
596
+ if int(I.user_id) == int(user_id):
597
+ SESSION.delete(I)
598
+ try:
599
+ SESSION.commit()
600
+ except:
601
+ SESSION.rollback()
602
+ return False
603
+ finally:
604
+ SESSION.commit()
605
+ __load_all_feds_banned()
606
+ return I
607
+
608
+
609
+ def get_fban_user(fed_id, user_id):
610
+ list_fbanned = FEDERATION_BANNED_USERID.get(fed_id)
611
+ if list_fbanned is None:
612
+ FEDERATION_BANNED_USERID[fed_id] = []
613
+ if user_id in FEDERATION_BANNED_USERID[fed_id]:
614
+ r = SESSION.query(BansF).all()
615
+ reason = None
616
+ for I in r:
617
+ if I.fed_id == fed_id:
618
+ if int(I.user_id) == int(user_id):
619
+ reason = I.reason
620
+ time = I.time
621
+ return True, reason, time
622
+ else:
623
+ return False, None, None
624
+
625
+
626
+ def get_all_fban_users(fed_id):
627
+ list_fbanned = FEDERATION_BANNED_USERID.get(fed_id)
628
+ if list_fbanned is None:
629
+ FEDERATION_BANNED_USERID[fed_id] = []
630
+ return FEDERATION_BANNED_USERID[fed_id]
631
+
632
+
633
+ def get_all_fban_users_target(fed_id, user_id):
634
+ list_fbanned = FEDERATION_BANNED_FULL.get(fed_id)
635
+ if list_fbanned is None:
636
+ FEDERATION_BANNED_FULL[fed_id] = []
637
+ return False
638
+ getuser = list_fbanned[str(user_id)]
639
+ return getuser
640
+
641
+
642
+ def get_all_fban_users_global():
643
+ list_fbanned = FEDERATION_BANNED_USERID
644
+ total = []
645
+ for x in list(FEDERATION_BANNED_USERID):
646
+ for y in FEDERATION_BANNED_USERID[x]:
647
+ total.append(y)
648
+ return total
649
+
650
+
651
+ def get_all_feds_users_global():
652
+ list_fed = FEDERATION_BYFEDID
653
+ total = []
654
+ for x in list(FEDERATION_BYFEDID):
655
+ total.append(FEDERATION_BYFEDID[x])
656
+ return total
657
+
658
+
659
+ def search_fed_by_id(fed_id):
660
+ get = FEDERATION_BYFEDID.get(fed_id)
661
+ if get is None:
662
+ return False
663
+ else:
664
+ return get
665
+ result = False
666
+ for Q in curr:
667
+ if Q.fed_id == fed_id:
668
+ result = Q.fed_id
669
+
670
+ return result
671
+
672
+
673
+ def user_feds_report(user_id: int) -> bool:
674
+ user_setting = FEDERATION_NOTIFICATION.get(str(user_id))
675
+ if user_setting is None:
676
+ user_setting = True
677
+ return user_setting
678
+
679
+
680
+ def set_feds_setting(user_id: int, setting: bool):
681
+ with FEDS_SETTINGS_LOCK:
682
+ global FEDERATION_NOTIFICATION
683
+ user_setting = SESSION.query(FedsUserSettings).get(user_id)
684
+ if not user_setting:
685
+ user_setting = FedsUserSettings(user_id)
686
+
687
+ user_setting.should_report = setting
688
+ FEDERATION_NOTIFICATION[str(user_id)] = setting
689
+ SESSION.add(user_setting)
690
+ SESSION.commit()
691
+
692
+
693
+ async def get_fed_log(fed_id):
694
+ fed_setting = FEDERATION_BYFEDID.get(str(fed_id))
695
+ if fed_setting is None:
696
+ fed_setting = False
697
+ return fed_setting
698
+ if fed_setting.get("flog") is None:
699
+ return False
700
+ elif fed_setting.get("flog"):
701
+ try:
702
+ await dispatcher.bot.get_chat(fed_setting.get("flog"))
703
+ except BadRequest:
704
+ set_fed_log(fed_id, None)
705
+ return False
706
+ except Forbidden:
707
+ set_fed_log(fed_id, None)
708
+ return False
709
+ return fed_setting.get("flog")
710
+ else:
711
+ return False
712
+
713
+
714
+ def set_fed_log(fed_id, chat_id):
715
+ with FEDS_LOCK:
716
+ global FEDERATION_BYOWNER, FEDERATION_BYFEDID, FEDERATION_BYNAME
717
+ # Variables
718
+ getfed = FEDERATION_BYFEDID.get(str(fed_id))
719
+ owner_id = getfed["owner"]
720
+ fed_name = getfed["fname"]
721
+ fed_members = getfed["fusers"]
722
+ fed_rules = getfed["frules"]
723
+ fed_log = str(chat_id)
724
+ # Set user
725
+ FEDERATION_BYOWNER[str(owner_id)]["flog"] = fed_log
726
+ FEDERATION_BYFEDID[str(fed_id)]["flog"] = fed_log
727
+ FEDERATION_BYNAME[fed_name]["flog"] = fed_log
728
+ # Set on database
729
+ fed = Federations(
730
+ str(owner_id),
731
+ fed_name,
732
+ str(fed_id),
733
+ fed_rules,
734
+ fed_log,
735
+ str(fed_members),
736
+ )
737
+ SESSION.merge(fed)
738
+ SESSION.commit()
739
+ return True
740
+
741
+
742
+ def subs_fed(fed_id, my_fed):
743
+ check = get_spec_subs(fed_id, my_fed)
744
+ if check:
745
+ return False
746
+ with FEDS_SUBSCRIBER_LOCK:
747
+ subsfed = FedSubs(fed_id, my_fed)
748
+
749
+ SESSION.merge(subsfed) # merge to avoid duplicate key issues
750
+ SESSION.commit()
751
+ global FEDS_SUBSCRIBER, MYFEDS_SUBSCRIBER
752
+ # Temporary Data For Subbed Feds
753
+ if FEDS_SUBSCRIBER.get(fed_id, set()) == set():
754
+ FEDS_SUBSCRIBER[fed_id] = {my_fed}
755
+ else:
756
+ FEDS_SUBSCRIBER.get(fed_id, set()).add(my_fed)
757
+ # Temporary data for Fed Subs
758
+ if MYFEDS_SUBSCRIBER.get(my_fed, set()) == set():
759
+ MYFEDS_SUBSCRIBER[my_fed] = {fed_id}
760
+ else:
761
+ MYFEDS_SUBSCRIBER.get(my_fed, set()).add(fed_id)
762
+ return True
763
+
764
+
765
+ def unsubs_fed(fed_id, my_fed):
766
+ with FEDS_SUBSCRIBER_LOCK:
767
+ getsubs = SESSION.query(FedSubs).get((fed_id, my_fed))
768
+ if getsubs:
769
+ if my_fed in FEDS_SUBSCRIBER.get(fed_id, set()): # sanity check
770
+ FEDS_SUBSCRIBER.get(fed_id, set()).remove(my_fed)
771
+ if fed_id in MYFEDS_SUBSCRIBER.get(my_fed, set()): # sanity check
772
+ MYFEDS_SUBSCRIBER.get(my_fed, set()).remove(fed_id)
773
+
774
+ SESSION.delete(getsubs)
775
+ SESSION.commit()
776
+ return True
777
+
778
+ SESSION.close()
779
+ return False
780
+
781
+
782
+ def get_all_subs(fed_id):
783
+ return FEDS_SUBSCRIBER.get(fed_id, set())
784
+
785
+
786
+ def get_spec_subs(fed_id, fed_target):
787
+ if FEDS_SUBSCRIBER.get(fed_id, set()) == set():
788
+ return {}
789
+ else:
790
+ return FEDS_SUBSCRIBER.get(fed_id, fed_target)
791
+
792
+
793
+ def get_mysubs(my_fed):
794
+ return list(MYFEDS_SUBSCRIBER.get(my_fed))
795
+
796
+
797
+ def get_subscriber(fed_id):
798
+ return FEDS_SUBSCRIBER.get(fed_id, set())
799
+
800
+
801
+ def __load_all_feds():
802
+ global FEDERATION_BYOWNER, FEDERATION_BYFEDID, FEDERATION_BYNAME
803
+ try:
804
+ feds = SESSION.query(Federations).all()
805
+ for x in feds: # remove tuple by ( ,)
806
+ # Fed by Owner
807
+ check = FEDERATION_BYOWNER.get(x.owner_id)
808
+ if check is None:
809
+ FEDERATION_BYOWNER[x.owner_id] = []
810
+ FEDERATION_BYOWNER[str(x.owner_id)] = {
811
+ "fid": str(x.fed_id),
812
+ "fname": x.fed_name,
813
+ "frules": x.fed_rules,
814
+ "flog": x.fed_log,
815
+ "fusers": str(x.fed_users),
816
+ }
817
+ # Fed By FedId
818
+ check = FEDERATION_BYFEDID.get(x.fed_id)
819
+ if check is None:
820
+ FEDERATION_BYFEDID[x.fed_id] = []
821
+ FEDERATION_BYFEDID[str(x.fed_id)] = {
822
+ "owner": str(x.owner_id),
823
+ "fname": x.fed_name,
824
+ "frules": x.fed_rules,
825
+ "flog": x.fed_log,
826
+ "fusers": str(x.fed_users),
827
+ }
828
+ # Fed By Name
829
+ check = FEDERATION_BYNAME.get(x.fed_name)
830
+ if check is None:
831
+ FEDERATION_BYNAME[x.fed_name] = []
832
+ FEDERATION_BYNAME[x.fed_name] = {
833
+ "fid": str(x.fed_id),
834
+ "owner": str(x.owner_id),
835
+ "frules": x.fed_rules,
836
+ "flog": x.fed_log,
837
+ "fusers": str(x.fed_users),
838
+ }
839
+ finally:
840
+ SESSION.close()
841
+
842
+
843
+ def __load_all_feds_chats():
844
+ global FEDERATION_CHATS, FEDERATION_CHATS_BYID
845
+ try:
846
+ qall = SESSION.query(ChatF).all()
847
+ FEDERATION_CHATS = {}
848
+ FEDERATION_CHATS_BYID = {}
849
+ for x in qall:
850
+ # Federation Chats
851
+ check = FEDERATION_CHATS.get(x.chat_id)
852
+ if check is None:
853
+ FEDERATION_CHATS[x.chat_id] = {}
854
+ FEDERATION_CHATS[x.chat_id] = {"chat_name": x.chat_name, "fid": x.fed_id}
855
+ # Federation Chats By ID
856
+ check = FEDERATION_CHATS_BYID.get(x.fed_id)
857
+ if check is None:
858
+ FEDERATION_CHATS_BYID[x.fed_id] = []
859
+ FEDERATION_CHATS_BYID[x.fed_id].append(x.chat_id)
860
+ finally:
861
+ SESSION.close()
862
+
863
+
864
+ def __load_all_feds_banned():
865
+ global FEDERATION_BANNED_USERID, FEDERATION_BANNED_FULL
866
+ try:
867
+ FEDERATION_BANNED_USERID = {}
868
+ FEDERATION_BANNED_FULL = {}
869
+ qall = SESSION.query(BansF).all()
870
+ for x in qall:
871
+ check = FEDERATION_BANNED_USERID.get(x.fed_id)
872
+ if check is None:
873
+ FEDERATION_BANNED_USERID[x.fed_id] = []
874
+ if int(x.user_id) not in FEDERATION_BANNED_USERID[x.fed_id]:
875
+ FEDERATION_BANNED_USERID[x.fed_id].append(int(x.user_id))
876
+ check = FEDERATION_BANNED_FULL.get(x.fed_id)
877
+ if check is None:
878
+ FEDERATION_BANNED_FULL[x.fed_id] = {}
879
+ FEDERATION_BANNED_FULL[x.fed_id][x.user_id] = {
880
+ "first_name": x.first_name,
881
+ "last_name": x.last_name,
882
+ "user_name": x.user_name,
883
+ "reason": x.reason,
884
+ "time": x.time,
885
+ }
886
+ finally:
887
+ SESSION.close()
888
+
889
+
890
+ def __load_all_feds_settings():
891
+ global FEDERATION_NOTIFICATION
892
+ try:
893
+ getuser = SESSION.query(FedsUserSettings).all()
894
+ for x in getuser:
895
+ FEDERATION_NOTIFICATION[str(x.user_id)] = x.should_report
896
+ finally:
897
+ SESSION.close()
898
+
899
+
900
+ def __load_feds_subscriber():
901
+ global FEDS_SUBSCRIBER
902
+ global MYFEDS_SUBSCRIBER
903
+ try:
904
+ feds = SESSION.query(FedSubs.fed_id).distinct().all()
905
+ for (fed_id,) in feds: # remove tuple by ( ,)
906
+ FEDS_SUBSCRIBER[fed_id] = []
907
+ MYFEDS_SUBSCRIBER[fed_id] = []
908
+
909
+ all_fedsubs = SESSION.query(FedSubs).all()
910
+ for x in all_fedsubs:
911
+ FEDS_SUBSCRIBER[x.fed_id] += [x.fed_subs]
912
+ try:
913
+ MYFEDS_SUBSCRIBER[x.fed_subs] += [x.fed_id]
914
+ except KeyError:
915
+ getsubs = SESSION.query(FedSubs).get((x.fed_id, x.fed_subs))
916
+ if getsubs:
917
+ SESSION.delete(getsubs)
918
+ SESSION.commit()
919
+
920
+ FEDS_SUBSCRIBER = {x: set(y) for x, y in FEDS_SUBSCRIBER.items()}
921
+ MYFEDS_SUBSCRIBER = {x: set(y) for x, y in MYFEDS_SUBSCRIBER.items()}
922
+
923
+ finally:
924
+ SESSION.close()
925
+
926
+
927
+ __load_all_feds()
928
+ __load_all_feds_chats()
929
+ __load_all_feds_banned()
930
+ __load_all_feds_settings()
931
+ __load_feds_subscriber()