-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLogging.py
More file actions
406 lines (348 loc) · 10.8 KB
/
Logging.py
File metadata and controls
406 lines (348 loc) · 10.8 KB
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
# TODO: Implementation
# IDEA: Track which invite a user joined off of
import discord
import json
import os
from datetime import datetime
from discord.ext import commands
class Logging(commands.Cog):
def __init__(self, bot):
self.bot = bot
self.embed = discord.Embed()
self.logs = None
async def update_guilds(self):
savedGuilds = []
for guildID in self.logs:
savedGuilds.append(guildID)
guilds = []
for guild in self.bot.guilds:
guilds.append(str(guild.id))
addGuilds = [x for x in guilds if x not in savedGuilds]
removeGuilds = [x for x in savedGuilds if x not in guilds]
# Add new guilds
for guildID in addGuilds:
self.logs[str(guildID)] = {"channel": None}
# Remove disconnected guilds
for guildID in removeGuilds:
self.logs.pop(str(guildID))
await self.update_state()
@commands.Cog.listener()
async def on_ready(self):
print("Loading logging cog...")
await self.load_state()
await self.update_guilds()
print("Logging cog loaded")
@commands.command(pass_context=True, name="logging")
async def change_logging(self, ctx):
if ctx.message.author.guild_permissions.administrator:
for channel in ctx.message.channel_mentions:
if self.logs[str(ctx.message.guild.id)]["channel"] != int(channel.id):
self.logs[str(ctx.message.guild.id)]["channel"] = int(channel.id)
print("Updating guild " + str(ctx.message.guild.id) + " to use logging channel " + str(channel.id))
await self.update_state()
print("Finished updating logging channel")
async def load_state(self):
with open(os.path.join("config", "logging.json"), "r+") as loggingFile:
logs = loggingFile.read()
self.logs = json.loads(logs)
async def update_state(self):
with open(os.path.join("config", "logging.json"), "r+") as loggingFile:
loggingFile.truncate(0)
loggingFile.seek(0)
json.dump(self.logs, loggingFile, indent=4)
@commands.Cog.listener()
async def on_message_delete(self, message):
"""
Sends a logging message containing
author, location (channel and placement), content, and time of the deleted message
:param message:
:return:
"""
if not message.author.bot:
if self.logs[str(message.guild.id)]["channel"] is not None:
loggingChannel = message.guild.get_channel(int(self.logs[str(message.guild.id)]["channel"]))
channel = message.channel
self.embed = discord.Embed()
self.embed.colour = discord.Colour(0xbe4041)
self.embed.set_author(name=message.author.name + "#" + message.author.discriminator, icon_url=message.author.avatar_url)
self.embed.title = "Message deleted in " + "#" + channel.name
self.embed.description = message.content
self.embed.set_footer(text="ID: " + str(message.author.id))
self.embed.timestamp = datetime.utcnow()
await loggingChannel.send(embed=self.embed)
@commands.Cog.listener()
async def on_raw_message_delete(self, payload):
"""
Sends a logging message containing
location (channel), and ID of the message deleted
:param payload:
:return:
"""
guild = self.bot.get_guild(payload.guild_id)
if self.logs[str(guild.id)]["channel"] is not None and payload.cached_message is None:
loggingChannel = guild.get_channel(int(self.logs[str(guild.id)]["channel"]))
channel = guild.get_channel(payload.channel_id)
self.embed = discord.Embed()
self.embed.colour = discord.Colour(0xbe4041)
self.embed.title = "Message deleted in " + "#" + channel.name
self.embed.set_footer(text="Uncached message")
self.embed.timestamp = datetime.utcnow()
await loggingChannel.send(embed=self.embed)
@commands.Cog.listener()
async def on_raw_bulk_message_delete(self, payload):
"""
Sends a logging message containing
author, location (channel and placement), content, and time of the deleted messages
May be limited if message is not in the cache
:param payload:
:return:
"""
guild = self.bot.get_guild(payload.guild_id)
if self.logs[str(guild.id)]["channel"] is not None:
loggingChannel = guild.get_channel(int(self.logs[str(guild.id)]["channel"]))
channel = guild.get_channel(payload.channel_id)
content = ""
for message in payload.cached_messages:
content += "[" + message.author.name + "#" + message.author.discriminator + "]: " + message.content + "\n"
self.embed = discord.Embed()
self.embed.colour = discord.Colour(0xbe4041)
self.embed.title = "Messages bulk deleted in " + "#" + channel.name
self.embed.description = content
self.embed.timestamp = datetime.utcnow()
await loggingChannel.send(embed=self.embed)
@commands.Cog.listener()
async def on_message_edit(self, before, after):
"""
Sends a logging message containing
the content of the message before and after the edit
:param before:
:param after:
:return:
"""
if not before.author.bot:
if self.logs[str(before.guild.id)]["channel"] is not None:
loggingChannel = before.guild.get_channel(int(self.logs[str(before.guild.id)]["channel"]))
channel = before.channel
self.embed = discord.Embed()
self.embed.colour = discord.Colour(0x8899d4)
self.embed.set_author(name=before.author.name + "#" + before.author.discriminator, icon_url=before.author.avatar_url)
self.embed.title = "Message edited in " + "#" + channel.name
self.embed.description = "**Before:** " + before.content + "\n**+After:** " + after.content
self.embed.set_footer(text="ID: " + str(before.author.id))
self.embed.timestamp = datetime.utcnow()
await loggingChannel.send(embed=self.embed)
@commands.Cog.listener()
async def on_raw_message_edit(self, payload):
"""
Sends a logging message containing
the content of the message after the edit
:param payload:
:return:
"""
# FIXME: Cannot get guild from payload
# guild = self.bot.get_guild(payload.guild_id)
#
# if self.logs[str(guild.id)]["channel"] is not None and payload.cached_message is None:
# loggingChannel = guild.get_channel(int(self.logs[str(guild.id)]["channel"]))
# channel = guild.get_channel(payload.channel_id)
# message = channel.fetch_message(payload.message_id)
#
# self.embed = discord.Embed()
# self.embed.colour = discord.Colour(0x8899d4)
# self.embed.set_author(name=message.author.name + "#" + message.author.discriminator, icon_url=message.author.avatar_url)
# self.embed.title = "Message edited in " + "#" + channel.name
# self.embed.description = "\n**+After:** " + message.content
# self.embed.set_footer(text="ID: " + str(message.author.id))
# self.embed.timestamp = datetime.utcnow()
#
# await loggingChannel.send(embed=self.embed)
@commands.Cog.listener()
async def on_guild_channel_create(self, channel):
"""
Sends a logging message containing
the name, category, and permissions of the channel
:param channel:
:return:
"""
return
@commands.Cog.listener()
async def on_guild_channel_delete(self, channel):
"""
Sends a logging message containing
the name and category of the channel
:param channel:
:return:
"""
return
@commands.Cog.listener()
async def on_guild_channel_update(self, before, after):
"""
Sends a logging message containing
the updated properties of the channel
:param before:
:param after:
:return:
"""
return
@commands.Cog.listener()
async def on_guild_channel_pins_update(self, channel, last_pin):
"""
Sends a logging message containing
the name of the channel, the content of the pinned message, and a link to the message
:param channel:
:param last_pin:
:return:
"""
return
@commands.Cog.listener()
async def on_guild_integrations_update(self, guild):
"""
WTF are guild integrations???
:param guild:
:return:
"""
return
@commands.Cog.listener()
async def on_webhooks_update(self, channel):
"""
WTF are webhooks???
:param channel:
:return:
"""
return
@commands.Cog.listener()
async def on_member_join(self, member):
"""
Sends a logging message containing
the name, avatar, id, join position, account age
:param member:
:return:
"""
return
@commands.Cog.listener()
async def on_member_remove(self, member):
"""
Sends a logging message containing
the name, avatar, id, time spent on the server
:param member:
:return:
"""
return
@commands.Cog.listener()
async def on_member_update(self, before, after):
"""
Sends a logging message containing
the property of the member updated before and after
:param before:
:param after:
:return:
"""
return
@commands.Cog.listener()
async def on_user_update(self, before, after):
"""
Sends a logging message containing
the property of the user updated before and after
:param before:
:param after:
:return:
"""
return
@commands.Cog.listener()
async def on_guild_update(self, before, after):
"""
Sends a logging message containing
the property of the guild updated before and after
:param before:
:param after:
:return:
"""
return
@commands.Cog.listener()
async def on_guild_role_create(self, role):
"""
Sends a logging message containing
the id, name, color, mentionable, and hoisted properties of the role
:param role:
:return:
"""
return
@commands.Cog.listener()
async def on_guild_role_delete(self, role):
"""
Sends a logging message containing
the id, name, color, mentionable, and hoisted properties of the role
:param role:
:return:
"""
return
@commands.Cog.listener()
async def on_guild_role_update(self, before, after):
"""
Sends a logging message containing
the property of the role updated before and after
:param before:
:param after:
:return:
"""
return
@commands.Cog.listener()
async def on_guild_emojis_update(self, guild, before, after):
"""
Sends a logging message containing
the id, name, and picture of the emoji
:param guild:
:param before:
:param after:
:return:
"""
return
@commands.Cog.listener()
async def on_voice_state_update(self, member, before, after):
"""
Sends a logging message containing
the id, name, and updated voice properties of the member
:param member:
:param before:
:param after:
:return:
"""
return
@commands.Cog.listener()
async def on_member_ban(self, guild, user):
"""
Sends a logging message containing
the id, name, and join date of the member
:param guild:
:param user:
:return:
"""
return
@commands.Cog.listener()
async def on_member_unban(self, guild, user):
"""
Sends a logging message containing
the id and name of the member
:param guild:
:param user:
:return:
"""
return
@commands.Cog.listener()
async def on_invite_create(self, invite):
"""
Sends a logging message containing
the invite code, inviter name, inviter id, expiration time
:param invite:
:return:
"""
return
@commands.Cog.listener()
async def on_invite_delete(self, invite):
"""
Sends a logging message containing
the invite code, inviter name, and expiration time
:param invite:
:return:
"""
return