|
1 | 1 | import discord |
2 | | -from discord import ui |
3 | 2 | from discord.ext import commands |
4 | 3 | from discord.utils import MISSING |
5 | 4 |
|
6 | 5 | from datetime import datetime, timedelta, timezone |
7 | 6 | from pymongo.mongo_client import MongoClient |
8 | 7 |
|
9 | 8 | from settings import LOGS_CHANNEL_ID, DMS_LOGS_GUILD_ID, GUILD, CREATE_VC_CHANNEL_ID, MONGO_URI |
10 | | -from utils import Emojis, no_color, no_ping, fake_send, DB, LazyLayout |
| 9 | +from utils.msg_utils import Emojis |
| 10 | +from utils.shortcuts import no_ping, no_color |
| 11 | +from utils.fake_user import fake_send |
| 12 | +from utils.users_db import DB |
11 | 13 |
|
12 | 14 | command_statistics = MongoClient(MONGO_URI).antbot.command_statistics |
13 | 15 |
|
14 | 16 |
|
15 | 17 | class Logs(commands.Cog, name="no_help_logs"): |
16 | 18 | def __init__(self, bot): |
17 | | - self.bot: commands.Bot = bot |
| 19 | + self.bot = bot |
18 | 20 |
|
19 | 21 | @commands.Cog.listener(name="on_member_update") |
20 | | - async def nick_changed(self, before: discord.Member, after: discord.Member): |
| 22 | + async def nick_changed(self, before, after): |
21 | 23 | if after.guild.id == GUILD and before.nick != after.nick: |
22 | | - |
| 24 | + embed = discord.Embed(title=f"{Emojis.user} Ник обновлён", color=no_color) |
| 25 | + embed.set_author(name=after.name, icon_url=after.display_avatar.url) |
| 26 | + embed.add_field(name="До", value=before.display_name) |
| 27 | + embed.add_field(name="После", value=after.display_name) |
| 28 | + embed.add_field(name="Участник", value=after.mention, inline=False) |
| 29 | + # |
23 | 30 | log_channel = await self.bot.fetch_channel(LOGS_CHANNEL_ID) |
24 | | - await log_channel.send( |
25 | | - view=LazyLayout( |
26 | | - ui.Section( |
27 | | - f"# {Emojis.user} Ник обновлён\n" |
28 | | - f"**Участник**\n{after.mention}\n" |
29 | | - f"**До**\n{before.display_name}\n" |
30 | | - f"**Поcле**\n{after.display_name}\n", |
31 | | - accessory=ui.Thumbnail(after.display_avatar.url) |
32 | | - ) |
33 | | - ), |
34 | | - allowed_mentions=no_ping |
35 | | - ) |
| 31 | + await log_channel.send(embed=embed) |
36 | 32 |
|
37 | 33 | @commands.Cog.listener(name="on_voice_state_update") |
38 | | - async def voice_event(self, member: discord.Member, before: discord.VoiceChannel, after: discord.VoiceChannel): |
| 34 | + async def voice_event(self, member, before, after): |
39 | 35 | if member.guild.id == GUILD: |
40 | | - |
41 | 36 | if before.channel != after.channel and after.channel != None and after.channel.id != CREATE_VC_CHANNEL_ID: |
42 | | - text = ( |
43 | | - f"# {Emojis.vc_joined} Участник зашёл в гк\n" |
44 | | - f"**Участник**\n{member.mention}\n" |
45 | | - f"**Канал**\n{after.channel.name} ({after.channel.mention})" |
46 | | - ) |
47 | | - |
| 37 | + embed = discord.Embed(title=f"{Emojis.vc_joined} Участник зашёл в гк", color=no_color) |
| 38 | + embed.set_author(name=member.name, icon_url=member.display_avatar.url) |
| 39 | + embed.add_field(name="Канал", value=f"{after.channel.name} ({after.channel.mention})") |
48 | 40 | elif not after.channel: |
49 | | - text = ( |
50 | | - f"# {Emojis.vc_left} Участник покинул гк\n" |
51 | | - f"**Участник**\n{member.mention}\n" |
52 | | - f"**Канал**\n{before.channel.name} ({before.channel.mention})" |
53 | | - ) |
54 | | - |
| 41 | + embed = discord.Embed(title=f"{Emojis.vc_left} Участник покинул гк", color=no_color) |
| 42 | + embed.set_author(name=member.name, icon_url=member.display_avatar.url) |
| 43 | + embed.add_field(name="Канал", value=f"{before.channel.name} ({before.channel.mention})") |
55 | 44 | else:return |
56 | 45 | # |
57 | 46 | log_channel = await self.bot.fetch_channel(LOGS_CHANNEL_ID) |
58 | | - await log_channel.send( |
59 | | - view=LazyLayout( |
60 | | - ui.Section( |
61 | | - text, |
62 | | - accessory=ui.Thumbnail(member.display_avatar.url) |
63 | | - ) |
64 | | - ), |
65 | | - allowed_mentions=no_ping |
66 | | - ) |
| 47 | + await log_channel.send(embed=embed) |
67 | 48 |
|
68 | 49 | @commands.Cog.listener(name="on_message_edit") |
69 | | - async def edited(self, before: discord.Message, after: discord.Message): |
| 50 | + async def edited(self, before, after): |
70 | 51 | if after.guild and after.guild.id == GUILD and after.author.id != self.bot.user.id and before.content != after.content\ |
71 | 52 | and not isinstance(after.channel, discord.DMChannel): |
| 53 | + # Build ebmed |
| 54 | + embed = discord.Embed(title=f"{Emojis.edited_msg} Сообщение отредактировано", color=no_color) |
| 55 | + embed.set_author(icon_url=after.author.display_avatar.url, name=after.author.name) |
| 56 | + embed.add_field(name="Автор", value=after.author.mention) |
| 57 | + embed.add_field(name="Канал", value=after.channel.jump_url) |
| 58 | + embed.add_field(name="До", value=before.content[:1021] + ("..." if len(before.content) >= 1024 else ""), |
| 59 | + inline=False) |
| 60 | + embed.add_field(name="После", value=after.content[:1021] + ("..." if len(after.content) >= 1024 else ""), |
| 61 | + inline=False) |
| 62 | + # |
72 | 63 | log_channel = await self.bot.fetch_channel(LOGS_CHANNEL_ID) |
73 | | - |
74 | | - views: list[discord.Message] = [] |
75 | | - main_text = (f"# {Emojis.edited_msg} Сообщение отредактировано\n" |
76 | | - f"**Автор**\n{after.author.mention}\n") |
77 | | - |
78 | | - b_fits = True if len(before.content) <= 3994 else False |
79 | | - a_fits = True if len(after.content) <= 3992 else False |
80 | | - before_field = f"# До\n{before.content[:None if b_fits else -9]}{'...' if not b_fits else ''}\n" |
81 | | - after_field = f"# После\n{after.content[:None if a_fits else -12]}{'...' if not a_fits else ''}" |
82 | | - |
83 | | - if len(main_n_before:=(main_text + before_field)) <= 4000: |
84 | | - main_text = main_n_before |
85 | | - if len(main_n_after:=(main_text + after_field)) <= 4000: |
86 | | - main_text = main_n_after |
87 | | - else: |
88 | | - views.append(LazyLayout(ui.TextDisplay(after_field))) |
89 | | - elif len(before_n_after:=(before_field + after_field)) <= 4000: |
90 | | - views.append(LazyLayout(ui.TextDisplay(before_n_after))) |
91 | | - else: |
92 | | - views.append(LazyLayout(ui.TextDisplay(before_field))) |
93 | | - views.append(LazyLayout(ui.TextDisplay(after_field))) |
94 | | - views.insert(0, LazyLayout(ui.Section(main_text, accessory=ui.Thumbnail(after.author.display_avatar.url)))) |
95 | | - |
96 | | - for view in views: |
97 | | - await log_channel.send(view=view, allowed_mentions=no_ping) |
| 64 | + await log_channel.send(embed=embed, view=JumpMessage(after.jump_url)) |
98 | 65 |
|
99 | 66 | @commands.Cog.listener(name="on_message_delete") |
100 | | - async def deleted(self, msg: discord.Message): |
| 67 | + async def deleted(self, msg): |
101 | 68 | if msg.guild.id != GUILD:return |
102 | 69 | if msg.author.id != self.bot.user.id and not isinstance(msg.channel, discord.DMChannel): |
103 | 70 | # Getting files from message |
104 | | - files = [] |
105 | | - media_gal = ui.MediaGallery() |
106 | | - non_media = [] |
107 | 71 | if msg.attachments != None: |
| 72 | + files = [] |
108 | 73 | for attachment in msg.attachments: |
109 | 74 | files.append(await attachment.to_file()) |
110 | | - if attachment.content_type and any((i in attachment.content_type.lower() for i in ("video", "image"))): |
111 | | - media_gal.add_item(media=f"attachment://{attachment.filename}") |
112 | | - else: |
113 | | - non_media.append(ui.File(f"attachment://{attachment.filename}")) |
114 | | - attachment_items = [] |
115 | | - if media_gal.items: |
116 | | - attachment_items.append(media_gal) |
117 | | - if non_media: |
118 | | - attachment_items += non_media |
| 75 | + else: |
| 76 | + files = MISSING |
119 | 77 | # Deleter |
120 | 78 | now = datetime.now(timezone.utc) |
121 | 79 | deleter = msg.author.mention |
122 | 80 | guild = await self.bot.fetch_guild(GUILD) |
123 | 81 | async for entry in guild.audit_logs(limit=5): |
124 | 82 | if entry.action == discord.AuditLogAction.message_delete and entry.target.id == msg.author.id and\ |
125 | | - abs(now - entry.created_at) <= timedelta(seconds=2): |
| 83 | + abs(now - entry.created_at) <= timedelta(seconds=1): |
126 | 84 | deleter = entry.user.mention |
127 | 85 | # Build ebmed |
| 86 | + embed = discord.Embed(title=f"{Emojis.deleted_msg} Сообщение удалено", color=no_color) |
| 87 | + embed.set_author(icon_url=msg.author.display_avatar.url, name=msg.author.name) |
| 88 | + embed.add_field(name="Автор", value=msg.author.mention) |
| 89 | + embed.add_field(name="Удалитель", value=deleter) |
| 90 | + embed.add_field(name="Канал", value=msg.channel.jump_url) |
| 91 | + embed.add_field(name="Содержимое", value=msg.content[:1021] + ("..." if len(msg.content) >= 1024 else ""), inline=False) |
| 92 | + # |
128 | 93 | log_channel = await self.bot.fetch_channel(LOGS_CHANNEL_ID) |
129 | | - await log_channel.send( |
130 | | - view=LazyLayout( |
131 | | - ui.Section( |
132 | | - f"{Emojis.deleted_msg} Сообщение удалено\n" |
133 | | - f"**Автор**\n{msg.author.mention}\n" |
134 | | - f"**Удалитель**\n{deleter}\n" |
135 | | - f"**Канал**\n{msg.channel.jump_url}\n", |
136 | | - accessory=ui.Thumbnail(msg.author.display_avatar.url) |
137 | | - ) |
138 | | - ), |
139 | | - allowed_mentions=no_ping |
140 | | - ) |
141 | | - await log_channel.send( |
142 | | - view=LazyLayout( |
143 | | - ui.TextDisplay(f"## Содержимое\n{msg.content}"), |
144 | | - *attachment_items |
145 | | - ), |
146 | | - files=files, |
147 | | - allowed_mentions=no_ping |
148 | | - ) |
| 94 | + await log_channel.send(embed=embed, files=files) |
149 | 95 |
|
150 | 96 | #dms |
151 | 97 | @commands.Cog.listener(name="on_message") |
|
0 commit comments