forked from Fumesover/EpiLogin
/
utils.py
124 lines (95 loc) · 3.55 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import discord
import asyncio
import string
import api
import logs
async def __del_roles(member, roles):
to_remove = []
if member and roles:
server = member.guild
for role in roles:
r = member.guild.get_role(role)
if r:
to_remove.append(r)
await member.remove_roles(*to_remove)
return to_remove
async def __add_roles(member, roles):
new_roles = []
if member and roles:
server = member.guild
for role in roles:
r = member.guild.get_role(role)
if r:
new_roles.append(r)
await member.add_roles(*new_roles)
return new_roles
async def set_roles(client, config, member, to_set):
conf_roles = config['servers'][member.guild.id]['ranks']
to_del = [] + conf_roles['banned'] + conf_roles['confirmed']
for role in conf_roles['classic']:
to_del += conf_roles['classic'][role]
for role in to_set:
if role in to_del:
to_del.remove(role)
user_roles = [r.id for r in member.roles]
to_remove = [id for id in to_del if id in user_roles]
to_add = [id for id in to_set if not id in user_roles]
removed = await __del_roles(member, to_remove)
added = await __add_roles(member, to_add)
await logs.set_roles(client, config, member, added, removed)
async def send_hello(client, member, hash, config):
try:
url = config['website']['url'] + "/login/?next=/certify/?token=" + hash
message = '\n'.join([
string.Template(s).safe_substitute(
server=member.guild.name,
) for s in config['bot']['welcome']
]) + '\n' + url
channel = member.dm_channel
if not channel:
channel = await member.create_dm()
await channel.send(message)
except Exception:
await logs.reject_dm(client, member, config)
async def on_certify(client, config, member, email):
config_ranks = config['servers'][member.guild.id]['ranks']
user_groups = api.get_groups(config, email=email)
user_groups = user_groups if user_groups else []
ranks = []
for group in user_groups:
if group['group'] in config_ranks['classic']:
ranks += config_ranks['classic'][group['group']]
if not email.split('@')[1] in config['servers'][member.guild.id]['domains']:
ranks = config_ranks['banned']
elif check_ban(member, email, user_groups, config):
ranks = config_ranks['banned']
else:
ranks += config_ranks['confirmed']
await set_roles(client, config, member, ranks)
async def on_member_join(client, member, config, create_if_unk=True):
user = api.get_member(config, member.id)
if not user:
if not create_if_unk:
return
user = api.create_member(config, member)
else:
api.update_username(config, member)
api.on_member_join(config, member.guild.id, member.id)
email = user['email']
if not email:
if not create_if_unk:
return
await logs.new_user(client, member, config)
await send_hello(client, member, user['hash'], config)
else:
await on_certify(client, config, member, email)
def check_ban(member, email, groups, config):
server_id = member.guild.id
if email in config['servers'][server_id]['bans']['email']:
return True
if str(member.id) in config['servers'][server_id]['bans']['user']:
return True
for group in groups:
if group in config['servers'][server_id]['bans']['group']:
return True
return False