From d315d449d249e3880b5006397628afb0dbbf18ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mj=C3=B6llnir?= Date: Tue, 21 Jan 2025 19:02:09 +0100 Subject: [PATCH 1/4] spaces2tabs --- module_logs.lua | 358 ++++++++++++++++++++++++------------------------ 1 file changed, 179 insertions(+), 179 deletions(-) diff --git a/module_logs.lua b/module_logs.lua index 9e89697..2f81ec1 100644 --- a/module_logs.lua +++ b/module_logs.lua @@ -11,31 +11,31 @@ Module.Name = "logs" function Module:GetConfigTable() return { - { - Name = "ChannelManagementLogChannel", - Description = "Where channel created/updated/deleted should be logged", - Type = bot.ConfigType.Channel, - Optional = true - }, + { + Name = "ChannelManagementLogChannel", + Description = "Where channel created/updated/deleted should be logged", + Type = bot.ConfigType.Channel, + Optional = true + }, { Name = "DeletedMessageChannel", Description = "Where deleted messages should be logged", Type = bot.ConfigType.Channel, Optional = true }, - { - Name = "NicknameChangedLogChannel", - Description = "Where nickname changes should be logged", - Type = bot.ConfigType.Channel, - Optional = true - }, - { - Name = "IgnoredDeletedMessageChannels", - Description = "Messages deleted in those channels will not be logged", - Type = bot.ConfigType.Channel, - Array = true, - Default = {} - }, + { + Name = "NicknameChangedLogChannel", + Description = "Where nickname changes should be logged", + Type = bot.ConfigType.Channel, + Optional = true + }, + { + Name = "IgnoredDeletedMessageChannels", + Description = "Messages deleted in those channels will not be logged", + Type = bot.ConfigType.Channel, + Array = true, + Default = {} + }, { Global = true, Name = "PersistentMessageCacheSize", @@ -47,213 +47,213 @@ function Module:GetConfigTable() end function Module:OnEnable(guild) - local data = self:GetData(guild) + local data = self:GetData(guild) - -- Keep a reference to the last X messages of every text channel - local messageCacheSize = self.GlobalConfig.PersistentMessageCacheSize - data.cachedMessages = {} + -- Keep a reference to the last X messages of every text channel + local messageCacheSize = self.GlobalConfig.PersistentMessageCacheSize + data.cachedMessages = {} - data.nicknames = {} - for userId, user in pairs(guild.members) do - data.nicknames[userId] = user.nickname - end - data.usernames = {} - for userId, user in pairs(guild.members) do - data.usernames[userId] = user._user._username - end + data.nicknames = {} + for userId, user in pairs(guild.members) do + data.nicknames[userId] = user.nickname + end + data.usernames = {} + for userId, user in pairs(guild.members) do + data.usernames[userId] = user._user._username + end coroutine.wrap(function () - for _, channel in pairs(guild.textChannels) do - data.cachedMessages[channel.id] = Bot:FetchChannelMessages(channel, nil, messageCacheSize, true) - end - end)() + for _, channel in pairs(guild.textChannels) do + data.cachedMessages[channel.id] = Bot:FetchChannelMessages(channel, nil, messageCacheSize, true) + end + end)() return true end function Module:OnChannelDelete(channel) local guild = channel.guild - if not guild then - return - end - - local data = self:GetData(guild) - data.cachedMessages[channel.id] = nil - - local config = self:GetConfig(guild) - local channelManagementLogChannel = config.ChannelManagementLogChannel - if not channelManagementLogChannel then - return - end - - local logChannel = guild:getChannel(channelManagementLogChannel) - if not logChannel then - self:LogWarning(guild, "Channel management log channel %s no longer exists", channelManagementLogChannel) - return - end - - logChannel:send({ - embed = { - title = "Channel deleted", - description = channel.name, - timestamp = discordia.Date():toISO('T', 'Z') - } - }) + if not guild then + return + end + + local data = self:GetData(guild) + data.cachedMessages[channel.id] = nil + + local config = self:GetConfig(guild) + local channelManagementLogChannel = config.ChannelManagementLogChannel + if not channelManagementLogChannel then + return + end + + local logChannel = guild:getChannel(channelManagementLogChannel) + if not logChannel then + self:LogWarning(guild, "Channel management log channel %s no longer exists", channelManagementLogChannel) + return + end + + logChannel:send({ + embed = { + title = "Channel deleted", + description = channel.name, + timestamp = discordia.Date():toISO('T', 'Z') + } + }) end function Module:OnChannelCreate(channel) - local guild = channel.guild - if not guild then - return - end - - local config = self:GetConfig(guild) - local channelManagementLogChannel = config.ChannelManagementLogChannel - if not channelManagementLogChannel then - return - end - - local logChannel = guild:getChannel(channelManagementLogChannel) - if not logChannel then - self:LogWarning(guild, "Channel management log channel %s no longer exists", channelManagementLogChannel) - return - end - - logChannel:send({ - embed = { - title = "Channel created", - description = "<#" .. channel.id .. ">", - timestamp = discordia.Date():toISO('T', 'Z') - } - }) + local guild = channel.guild + if not guild then + return + end + + local config = self:GetConfig(guild) + local channelManagementLogChannel = config.ChannelManagementLogChannel + if not channelManagementLogChannel then + return + end + + local logChannel = guild:getChannel(channelManagementLogChannel) + if not logChannel then + self:LogWarning(guild, "Channel management log channel %s no longer exists", channelManagementLogChannel) + return + end + + logChannel:send({ + embed = { + title = "Channel created", + description = "<#" .. channel.id .. ">", + timestamp = discordia.Date():toISO('T', 'Z') + } + }) end function Module:OnMemberUpdate(member) - local guild = member.guild - if not guild then - return - end + local guild = member.guild + if not guild then + return + end - local config = self:GetConfig(guild) - local nicknameChangeLogChannel = config.NicknameChangedLogChannel - if not nicknameChangeLogChannel then - return - end + local config = self:GetConfig(guild) + local nicknameChangeLogChannel = config.NicknameChangedLogChannel + if not nicknameChangeLogChannel then + return + end - local logChannel = guild:getChannel(nicknameChangeLogChannel) - if not logChannel then - self:LogWarning(guild, "Channel management log channel %s no longer exists", nicknameChangeLogChannel) - return - end + local logChannel = guild:getChannel(nicknameChangeLogChannel) + if not logChannel then + self:LogWarning(guild, "Channel management log channel %s no longer exists", nicknameChangeLogChannel) + return + end - local data = self:GetData(guild) + local data = self:GetData(guild) -- Ignore the first nickname change because new members tend to change it directly after joining which generates a lot of useless logs - if data.nicknames[member.id] ~= nil and data.nicknames[member.id] ~= member.name then - logChannel:send({ - embed = { - title = "Nickname changed", - description = string.format("%s - `%s` → `%s`", member.mentionString, data.nicknames[member.id], member.name), - timestamp = discordia.Date():toISO('T', 'Z') - } - }) - end - - if data.usernames[member.id] ~= nil and data.usernames[member.id] ~= member.user.username then - logChannel:send({ - embed = { - title = "Username changed", - description = string.format("%s - `%s` → `%s`", member.mentionString, data.usernames[member.id], member.user.username), - timestamp = discordia.Date():toISO('T', 'Z') - } - }) - end - - data.nicknames[member.id] = member.name - data.usernames[member.id] = member.user.username + if data.nicknames[member.id] ~= nil and data.nicknames[member.id] ~= member.name then + logChannel:send({ + embed = { + title = "Nickname changed", + description = string.format("%s - `%s` → `%s`", member.mentionString, data.nicknames[member.id], member.name), + timestamp = discordia.Date():toISO('T', 'Z') + } + }) + end + + if data.usernames[member.id] ~= nil and data.usernames[member.id] ~= member.user.username then + logChannel:send({ + embed = { + title = "Username changed", + description = string.format("%s - `%s` → `%s`", member.mentionString, data.usernames[member.id], member.user.username), + timestamp = discordia.Date():toISO('T', 'Z') + } + }) + end + + data.nicknames[member.id] = member.name + data.usernames[member.id] = member.user.username end function Module:OnMessageDelete(message) - local guild = message.guild - local config = self:GetConfig(guild) + local guild = message.guild + local config = self:GetConfig(guild) - if table.search(config.IgnoredDeletedMessageChannels, message.channel.id) then - return - end + if table.search(config.IgnoredDeletedMessageChannels, message.channel.id) then + return + end - local deletedMessageChannel = config.DeletedMessageChannel - if not deletedMessageChannel then - return - end + local deletedMessageChannel = config.DeletedMessageChannel + if not deletedMessageChannel then + return + end - local logChannel = guild:getChannel(deletedMessageChannel) - if not logChannel then - self:LogWarning(guild, "Deleted message log channel %s no longer exists", deletedMessageChannel) - return - end + local logChannel = guild:getChannel(deletedMessageChannel) + if not logChannel then + self:LogWarning(guild, "Deleted message log channel %s no longer exists", deletedMessageChannel) + return + end - local desc = "🗑️ **Deleted message - sent by " .. message.author.mentionString .. " in " .. message.channel.mentionString .. "**\n" + local desc = "🗑️ **Deleted message - sent by " .. message.author.mentionString .. " in " .. message.channel.mentionString .. "**\n" local embed = Bot:BuildQuoteEmbed(message, { initialContentSize = #desc }) - embed.description = desc .. (embed.description or "") + embed.description = desc .. (embed.description or "") embed.footer = { text = string.format("Author ID: %s | Message ID: %s", message.author.id, message.id) } - embed.timestamp = discordia.Date():toISO('T', 'Z') + embed.timestamp = discordia.Date():toISO('T', 'Z') logChannel:send({ - embed = embed + embed = embed }) end function Module:OnMessageDeleteUncached(channel, messageId) - local guild = channel.guild - local config = self:GetConfig(guild) + local guild = channel.guild + local config = self:GetConfig(guild) - if table.search(config.IgnoredDeletedMessageChannels, channel.id) then - return - end + if table.search(config.IgnoredDeletedMessageChannels, channel.id) then + return + end - local deletedMessageChannel = config.DeletedMessageChannel - if not deletedMessageChannel then - return - end + local deletedMessageChannel = config.DeletedMessageChannel + if not deletedMessageChannel then + return + end - local logChannel = guild:getChannel(deletedMessageChannel) - if not logChannel then - self:LogWarning(guild, "Deleted message log channel %s no longer exists", deletedMessageChannel) - return - end + local logChannel = guild:getChannel(deletedMessageChannel) + if not logChannel then + self:LogWarning(guild, "Deleted message log channel %s no longer exists", deletedMessageChannel) + return + end logChannel:send({ - embed = { - description = "🗑️ **Deleted message (uncached) - sent by in " .. channel.mentionString .. "**", - footer = { - text = string.format("Message ID: %s", messageId) - }, - timestamp = discordia.Date():toISO('T', 'Z') - } + embed = { + description = "🗑️ **Deleted message (uncached) - sent by in " .. channel.mentionString .. "**", + footer = { + text = string.format("Message ID: %s", messageId) + }, + timestamp = discordia.Date():toISO('T', 'Z') + } }) end function Module:OnMessageCreate(message) local guild = message.guild - if not guild then - return - end - - local data = self:GetData(guild) - local cachedMessages = data.cachedMessages[message.channel.id] - if not cachedMessages then - cachedMessages = {} - data.cachedMessages[message.channel.id] = cachedMessages - end - - -- Remove oldest message from permanent cache and add the new message - table.insert(cachedMessages, message) - - local messageCacheSize = self.GlobalConfig.PersistentMessageCacheSize - while #cachedMessages > messageCacheSize do - table.remove(cachedMessages, 1) - end + if not guild then + return + end + + local data = self:GetData(guild) + local cachedMessages = data.cachedMessages[message.channel.id] + if not cachedMessages then + cachedMessages = {} + data.cachedMessages[message.channel.id] = cachedMessages + end + + -- Remove oldest message from permanent cache and add the new message + table.insert(cachedMessages, message) + + local messageCacheSize = self.GlobalConfig.PersistentMessageCacheSize + while #cachedMessages > messageCacheSize do + table.remove(cachedMessages, 1) + end end From 9e87bae0a35bed2644a95c24086dff6b9d5779bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mj=C3=B6llnir?= Date: Tue, 21 Jan 2025 19:08:31 +0100 Subject: [PATCH 2/4] fix warnings - remove unused and useless variables - break long lines --- module_logs.lua | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/module_logs.lua b/module_logs.lua index 2f81ec1..e9d1fc9 100644 --- a/module_logs.lua +++ b/module_logs.lua @@ -2,10 +2,6 @@ -- This file is part of the "Not a Bot" application -- For conditions of distribution and use, see copyright notice in LICENSE -local client = Client -local discordia = Discordia -local bot = Bot -local enums = discordia.enums Module.Name = "logs" @@ -14,25 +10,25 @@ function Module:GetConfigTable() { Name = "ChannelManagementLogChannel", Description = "Where channel created/updated/deleted should be logged", - Type = bot.ConfigType.Channel, + Type = Bot.ConfigType.Channel, Optional = true }, { Name = "DeletedMessageChannel", Description = "Where deleted messages should be logged", - Type = bot.ConfigType.Channel, + Type = Bot.ConfigType.Channel, Optional = true }, { Name = "NicknameChangedLogChannel", Description = "Where nickname changes should be logged", - Type = bot.ConfigType.Channel, + Type = Bot.ConfigType.Channel, Optional = true }, { Name = "IgnoredDeletedMessageChannels", Description = "Messages deleted in those channels will not be logged", - Type = bot.ConfigType.Channel, + Type = Bot.ConfigType.Channel, Array = true, Default = {} }, @@ -40,7 +36,7 @@ function Module:GetConfigTable() Global = true, Name = "PersistentMessageCacheSize", Description = "How many of the last messages of every text channel should stay in bot memory?", - Type = bot.ConfigType.Integer, + Type = Bot.ConfigType.Integer, Default = 50 }, } @@ -96,7 +92,7 @@ function Module:OnChannelDelete(channel) embed = { title = "Channel deleted", description = channel.name, - timestamp = discordia.Date():toISO('T', 'Z') + timestamp = Discordia.Date():toISO('T', 'Z') } }) end @@ -123,7 +119,7 @@ function Module:OnChannelCreate(channel) embed = { title = "Channel created", description = "<#" .. channel.id .. ">", - timestamp = discordia.Date():toISO('T', 'Z') + timestamp = Discordia.Date():toISO('T', 'Z') } }) end @@ -148,13 +144,15 @@ function Module:OnMemberUpdate(member) local data = self:GetData(guild) - -- Ignore the first nickname change because new members tend to change it directly after joining which generates a lot of useless logs + -- Ignore the first nickname change because new members tend to change it + -- directly after joining which generates a lot of useless logs if data.nicknames[member.id] ~= nil and data.nicknames[member.id] ~= member.name then logChannel:send({ embed = { title = "Nickname changed", - description = string.format("%s - `%s` → `%s`", member.mentionString, data.nicknames[member.id], member.name), - timestamp = discordia.Date():toISO('T', 'Z') + description = string.format("%s - `%s` → `%s`", + member.mentionString, data.nicknames[member.id], member.name), + timestamp = Discordia.Date():toISO('T', 'Z') } }) end @@ -163,8 +161,9 @@ function Module:OnMemberUpdate(member) logChannel:send({ embed = { title = "Username changed", - description = string.format("%s - `%s` → `%s`", member.mentionString, data.usernames[member.id], member.user.username), - timestamp = discordia.Date():toISO('T', 'Z') + description = string.format("%s - `%s` → `%s`", + member.mentionString, data.usernames[member.id], member.user.username), + timestamp = Discordia.Date():toISO('T', 'Z') } }) end @@ -192,14 +191,14 @@ function Module:OnMessageDelete(message) return end - local desc = "🗑️ **Deleted message - sent by " .. message.author.mentionString .. " in " .. message.channel.mentionString .. "**\n" - + local desc = string.format("🗑️ **Deleted message - sent by %s in %s**\n", + message.author.mentionString, message.channel.mentionString) local embed = Bot:BuildQuoteEmbed(message, { initialContentSize = #desc }) embed.description = desc .. (embed.description or "") embed.footer = { text = string.format("Author ID: %s | Message ID: %s", message.author.id, message.id) } - embed.timestamp = discordia.Date():toISO('T', 'Z') + embed.timestamp = Discordia.Date():toISO('T', 'Z') logChannel:send({ embed = embed @@ -231,7 +230,7 @@ function Module:OnMessageDeleteUncached(channel, messageId) footer = { text = string.format("Message ID: %s", messageId) }, - timestamp = discordia.Date():toISO('T', 'Z') + timestamp = Discordia.Date():toISO('T', 'Z') } }) end From 41edd1a6a100b93deb3268d64791b6186b1a5173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mj=C3=B6llnir?= Date: Tue, 21 Jan 2025 19:50:30 +0100 Subject: [PATCH 3/4] add logging for channel name updates --- module_logs.lua | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/module_logs.lua b/module_logs.lua index e9d1fc9..94a82fc 100644 --- a/module_logs.lua +++ b/module_logs.lua @@ -58,6 +58,14 @@ function Module:OnEnable(guild) data.usernames[userId] = user._user._username end + data.channelNames = {} + for channelId, channel in pairs(guild.textChannels) do + data.channelNames[channelId] = channel.name + end + for channelId, channel in pairs(guild.voiceChannels) do + data.channelNames[channelId] = channel.name + end + coroutine.wrap(function () for _, channel in pairs(guild.textChannels) do data.cachedMessages[channel.id] = Bot:FetchChannelMessages(channel, nil, messageCacheSize, true) @@ -75,6 +83,7 @@ function Module:OnChannelDelete(channel) local data = self:GetData(guild) data.cachedMessages[channel.id] = nil + data.channelNames[channel.id] = nil local config = self:GetConfig(guild) local channelManagementLogChannel = config.ChannelManagementLogChannel @@ -109,6 +118,9 @@ function Module:OnChannelCreate(channel) return end + local data = self:GetData(guild) + data.channelNames[channel.id] = channel.name + local logChannel = guild:getChannel(channelManagementLogChannel) if not logChannel then self:LogWarning(guild, "Channel management log channel %s no longer exists", channelManagementLogChannel) @@ -124,6 +136,49 @@ function Module:OnChannelCreate(channel) }) end +function Module:OnChannelUpdate(channel) + local guild = channel.guild + if not guild then + return + end + + local config = self:GetConfig(guild) + local channelManagementLogChannel = config.ChannelManagementLogChannel + if not channelManagementLogChannel then + return + end + + local data = self:GetData(guild) + -- Maybe a channel has been created when the bot was down + -- In this case, the old and new names will be identical + if not data.channelNames[channel.id] then + data.channelNames[channel.id] = channel.name + return + end + + -- We only want to log name updates + if data.channelNames[channel.id] == channel.name then + return + end + + local logChannel = guild:getChannel(channelManagementLogChannel) + if not logChannel then + self:LogWarning(guild, "Channel management log channel %s no longer exists", channelManagementLogChannel) + return + end + + logChannel:send({ + embed = { + title = "Channel updated", + description = string.format("%s - `%s` → `%s`", + channel.mentionString, data.channelNames[channel.id], channel.name), + timestamp = Discordia.Date():toISO('T', 'Z') + } + }) + + data.channelNames[channel.id] = channel.name +end + function Module:OnMemberUpdate(member) local guild = member.guild if not guild then From b82d2986b072c36b866c357bf7ee5f130ed05730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mj=C3=B6llnir?= Date: Sat, 1 Feb 2025 17:29:42 +0100 Subject: [PATCH 4/4] add local vars for used globals --- module_logs.lua | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/module_logs.lua b/module_logs.lua index 94a82fc..d825af4 100644 --- a/module_logs.lua +++ b/module_logs.lua @@ -2,6 +2,10 @@ -- This file is part of the "Not a Bot" application -- For conditions of distribution and use, see copyright notice in LICENSE +local Bot = Bot +local Discordia = Discordia +local Date = Discordia.Date + Module.Name = "logs" @@ -101,7 +105,7 @@ function Module:OnChannelDelete(channel) embed = { title = "Channel deleted", description = channel.name, - timestamp = Discordia.Date():toISO('T', 'Z') + timestamp = Date():toISO('T', 'Z') } }) end @@ -131,7 +135,7 @@ function Module:OnChannelCreate(channel) embed = { title = "Channel created", description = "<#" .. channel.id .. ">", - timestamp = Discordia.Date():toISO('T', 'Z') + timestamp = Date():toISO('T', 'Z') } }) end @@ -172,7 +176,7 @@ function Module:OnChannelUpdate(channel) title = "Channel updated", description = string.format("%s - `%s` → `%s`", channel.mentionString, data.channelNames[channel.id], channel.name), - timestamp = Discordia.Date():toISO('T', 'Z') + timestamp = Date():toISO('T', 'Z') } }) @@ -207,7 +211,7 @@ function Module:OnMemberUpdate(member) title = "Nickname changed", description = string.format("%s - `%s` → `%s`", member.mentionString, data.nicknames[member.id], member.name), - timestamp = Discordia.Date():toISO('T', 'Z') + timestamp = Date():toISO('T', 'Z') } }) end @@ -218,7 +222,7 @@ function Module:OnMemberUpdate(member) title = "Username changed", description = string.format("%s - `%s` → `%s`", member.mentionString, data.usernames[member.id], member.user.username), - timestamp = Discordia.Date():toISO('T', 'Z') + timestamp = Date():toISO('T', 'Z') } }) end @@ -253,7 +257,7 @@ function Module:OnMessageDelete(message) embed.footer = { text = string.format("Author ID: %s | Message ID: %s", message.author.id, message.id) } - embed.timestamp = Discordia.Date():toISO('T', 'Z') + embed.timestamp = Date():toISO('T', 'Z') logChannel:send({ embed = embed @@ -285,7 +289,7 @@ function Module:OnMessageDeleteUncached(channel, messageId) footer = { text = string.format("Message ID: %s", messageId) }, - timestamp = Discordia.Date():toISO('T', 'Z') + timestamp = Date():toISO('T', 'Z') } }) end