diff options
Diffstat (limited to 'cogs/trigger.py')
| -rw-r--r-- | cogs/trigger.py | 260 |
1 files changed, 0 insertions, 260 deletions
diff --git a/cogs/trigger.py b/cogs/trigger.py deleted file mode 100644 index ce80d43..0000000 --- a/cogs/trigger.py +++ /dev/null | |||
| @@ -1,260 +0,0 @@ | |||
| 1 | # This file is part of Senator Sperma | ||
| 2 | # Licensed under the GPL-3.0 License | ||
| 3 | # Copyright (C) 2026 Salmonik @ salmonik@tuta.io | ||
| 4 | # https://codeberg.org/salmonik/senator-sperma | ||
| 5 | |||
| 6 | import os | ||
| 7 | import discord | ||
| 8 | from discord.ext import commands | ||
| 9 | import random | ||
| 10 | import logging | ||
| 11 | |||
| 12 | from cogs.utils.database import get_connection, init_database | ||
| 13 | |||
| 14 | logger = logging.getLogger(__name__) | ||
| 15 | |||
| 16 | init_database() | ||
| 17 | |||
| 18 | _SELECT_KEYWORD_SQL = "SELECT keyword FROM trigger_keywords WHERE trigger_id=?" | ||
| 19 | _SELECT_RESPONSE_SQL = "SELECT response_text FROM trigger_responses WHERE trigger_id=?" | ||
| 20 | _SELECT_TRIGGER_ID_SQL = "SELECT id FROM triggers WHERE name=?" | ||
| 21 | _TRIGGER_NOT_FOUND_MSG = "Trigger not found." | ||
| 22 | _TRIGGER_NAME_OPTION = "the name of the trigger" | ||
| 23 | |||
| 24 | |||
| 25 | class Trigger(commands.Cog): | ||
| 26 | def __init__(self, bot): | ||
| 27 | self.bot = bot | ||
| 28 | |||
| 29 | trigger_group = discord.SlashCommandGroup("trigger", "trigger commands") | ||
| 30 | |||
| 31 | @commands.Cog.listener() | ||
| 32 | async def on_message(self, message): | ||
| 33 | if message.author == self.bot.user: | ||
| 34 | return | ||
| 35 | |||
| 36 | await self.trigger(message) | ||
| 37 | |||
| 38 | @staticmethod | ||
| 39 | async def trigger(message): | ||
| 40 | content = message.content.lower() | ||
| 41 | with get_connection() as conn: | ||
| 42 | c = conn.cursor() | ||
| 43 | c.execute("SELECT id, name FROM triggers") | ||
| 44 | for trigger_id, name in c.fetchall(): | ||
| 45 | c.execute(_SELECT_KEYWORD_SQL, (trigger_id,)) | ||
| 46 | keywords = [row[0] for row in c.fetchall()] | ||
| 47 | if any(keyword in content for keyword in keywords): | ||
| 48 | c.execute(_SELECT_RESPONSE_SQL, (trigger_id,)) | ||
| 49 | responses = [row[0] for row in c.fetchall()] | ||
| 50 | if responses: | ||
| 51 | await message.channel.send(random.choice(responses).replace('\\n', '\n')) | ||
| 52 | logger.info(f"{message.author} triggered {name}") | ||
| 53 | break | ||
| 54 | |||
| 55 | @staticmethod | ||
| 56 | def get_type(name): | ||
| 57 | with get_connection() as conn: | ||
| 58 | c = conn.cursor() | ||
| 59 | c.execute("SELECT name FROM triggers") | ||
| 60 | return [row[0] for row in c.fetchall()] | ||
| 61 | |||
| 62 | @trigger_group.command( | ||
| 63 | description="Create a new trigger", | ||
| 64 | ) | ||
| 65 | async def create( | ||
| 66 | self, | ||
| 67 | ctx: discord.ApplicationContext, | ||
| 68 | name = discord.Option( | ||
| 69 | str, | ||
| 70 | _TRIGGER_NAME_OPTION, | ||
| 71 | autocomplete= discord.utils.basic_autocomplete(get_type), | ||
| 72 | required=True | ||
| 73 | ) | ||
| 74 | ): | ||
| 75 | with get_connection() as conn: | ||
| 76 | c = conn.cursor() | ||
| 77 | c.execute("INSERT OR IGNORE INTO triggers (name) VALUES (?)", (name,)) | ||
| 78 | conn.commit() | ||
| 79 | |||
| 80 | await ctx.respond("trigger added") | ||
| 81 | |||
| 82 | @trigger_group.command( | ||
| 83 | description="Add a trigger or response to the name", | ||
| 84 | ) | ||
| 85 | async def add( | ||
| 86 | self, | ||
| 87 | ctx: discord.ApplicationContext, | ||
| 88 | name = discord.Option( | ||
| 89 | str, | ||
| 90 | _TRIGGER_NAME_OPTION, | ||
| 91 | autocomplete= discord.utils.basic_autocomplete(get_type), | ||
| 92 | required=True | ||
| 93 | ), | ||
| 94 | trigger = discord.Option( | ||
| 95 | str, | ||
| 96 | "the trigger to add to the name", | ||
| 97 | required=False | ||
| 98 | ), | ||
| 99 | response = discord.Option( | ||
| 100 | str, | ||
| 101 | "the response to add to the name", | ||
| 102 | required=False | ||
| 103 | ) | ||
| 104 | ): | ||
| 105 | with get_connection() as conn: | ||
| 106 | c = conn.cursor() | ||
| 107 | c.execute(_SELECT_TRIGGER_ID_SQL, (name,)) | ||
| 108 | row = c.fetchone() | ||
| 109 | if not row: | ||
| 110 | await ctx.respond(_TRIGGER_NOT_FOUND_MSG) | ||
| 111 | logger.warning(f"Trigger not found: {name}") | ||
| 112 | return | ||
| 113 | trigger_id = row[0] | ||
| 114 | if trigger: | ||
| 115 | for keyword in trigger.split('\\'): | ||
| 116 | keyword = keyword.strip() | ||
| 117 | if keyword: | ||
| 118 | c.execute("INSERT INTO trigger_keywords (trigger_id, keyword) VALUES (?, ?)", (trigger_id, keyword)) | ||
| 119 | if response: | ||
| 120 | for resp in response.split('\\'): | ||
| 121 | resp = resp.strip() | ||
| 122 | if resp: | ||
| 123 | c.execute("INSERT INTO trigger_responses (trigger_id, response_text) VALUES (?, ?)", (trigger_id, resp)) | ||
| 124 | conn.commit() | ||
| 125 | |||
| 126 | await ctx.respond("trigger updated") | ||
| 127 | logger.info(f"Trigger updated: {name}") | ||
| 128 | |||
| 129 | @trigger_group.command( | ||
| 130 | description="Remove a trigger or response from the name", | ||
| 131 | ) | ||
| 132 | async def remove( | ||
| 133 | self, | ||
| 134 | ctx: discord.ApplicationContext, | ||
| 135 | name = discord.Option( | ||
| 136 | str, | ||
| 137 | _TRIGGER_NAME_OPTION, | ||
| 138 | autocomplete= discord.utils.basic_autocomplete(get_type), | ||
| 139 | required=True | ||
| 140 | ), | ||
| 141 | trigger = discord.Option( | ||
| 142 | str, | ||
| 143 | "the trigger to remove from the name", | ||
| 144 | required=False | ||
| 145 | ), | ||
| 146 | response = discord.Option( | ||
| 147 | str, | ||
| 148 | "the response to remove from the name", | ||
| 149 | required=False | ||
| 150 | ) | ||
| 151 | ): | ||
| 152 | with get_connection() as conn: | ||
| 153 | c = conn.cursor() | ||
| 154 | c.execute(_SELECT_TRIGGER_ID_SQL, (name,)) | ||
| 155 | row = c.fetchone() | ||
| 156 | if not row: | ||
| 157 | await ctx.respond(_TRIGGER_NOT_FOUND_MSG) | ||
| 158 | logger.warning(f"Trigger not found: {name}") | ||
| 159 | return | ||
| 160 | trigger_id = row[0] | ||
| 161 | if trigger: | ||
| 162 | c.execute("DELETE FROM trigger_keywords WHERE trigger_id=? AND keyword=?", (trigger_id, trigger)) | ||
| 163 | if response: | ||
| 164 | c.execute("DELETE FROM trigger_responses WHERE trigger_id=? AND response_text=?", (trigger_id, response)) | ||
| 165 | conn.commit() | ||
| 166 | |||
| 167 | await ctx.respond("trigger removed") | ||
| 168 | logger.info(f"Trigger removed: {name}") | ||
| 169 | |||
| 170 | @trigger_group.command( | ||
| 171 | description="Delete the whole trigger", | ||
| 172 | ) | ||
| 173 | async def delete( | ||
| 174 | self, | ||
| 175 | ctx: discord.ApplicationContext, | ||
| 176 | name = discord.Option( | ||
| 177 | str, | ||
| 178 | _TRIGGER_NAME_OPTION, | ||
| 179 | autocomplete= discord.utils.basic_autocomplete(get_type), | ||
| 180 | required=True | ||
| 181 | ) | ||
| 182 | ): | ||
| 183 | with get_connection() as conn: | ||
| 184 | c = conn.cursor() | ||
| 185 | c.execute(_SELECT_TRIGGER_ID_SQL, (name,)) | ||
| 186 | row = c.fetchone() | ||
| 187 | if not row: | ||
| 188 | await ctx.respond(_TRIGGER_NOT_FOUND_MSG) | ||
| 189 | return | ||
| 190 | trigger_id = row[0] | ||
| 191 | c.execute("DELETE FROM trigger_keywords WHERE trigger_id=?", (trigger_id,)) | ||
| 192 | c.execute("DELETE FROM trigger_responses WHERE trigger_id=?", (trigger_id,)) | ||
| 193 | c.execute("DELETE FROM triggers WHERE id=?", (trigger_id,)) | ||
| 194 | conn.commit() | ||
| 195 | |||
| 196 | await ctx.respond("trigger deleted") | ||
| 197 | logger.info(f"Trigger deleted: {name}") | ||
| 198 | |||
| 199 | |||
| 200 | @trigger_group.command( | ||
| 201 | description="List all triggers", | ||
| 202 | ) | ||
| 203 | async def list( | ||
| 204 | self, | ||
| 205 | ctx: discord.ApplicationContext, | ||
| 206 | name = discord.Option( | ||
| 207 | str, | ||
| 208 | _TRIGGER_NAME_OPTION, | ||
| 209 | autocomplete=discord.utils.basic_autocomplete(get_type), | ||
| 210 | required=True | ||
| 211 | ) | ||
| 212 | ): | ||
| 213 | with get_connection() as conn: | ||
| 214 | c = conn.cursor() | ||
| 215 | if name: | ||
| 216 | c.execute("SELECT id FROM triggers WHERE name=?", (name,)) | ||
| 217 | row = c.fetchone() | ||
| 218 | if not row: | ||
| 219 | await ctx.respond(_TRIGGER_NOT_FOUND_MSG) | ||
| 220 | logger.warning(f"Trigger not found: {name}") | ||
| 221 | return | ||
| 222 | trigger_id = row[0] | ||
| 223 | c.execute(_SELECT_KEYWORD_SQL, (trigger_id,)) | ||
| 224 | triggers = [row[0] for row in c.fetchall()] | ||
| 225 | c.execute(_SELECT_RESPONSE_SQL, (trigger_id,)) | ||
| 226 | responses = [row[0] for row in c.fetchall()] | ||
| 227 | trigger_list = "\n".join(triggers) | ||
| 228 | response_list = "\n".join(responses) | ||
| 229 | message = f"**Trigger: {name}**\n**Triggers:**\n{trigger_list}\n**Responses:**\n{response_list}" | ||
| 230 | await ctx.respond(message) | ||
| 231 | logger.info(f"Trigger listed: {name}") | ||
| 232 | else: | ||
| 233 | c.execute("SELECT id, name FROM triggers") | ||
| 234 | messages = [] | ||
| 235 | for trigger_id, name in c.fetchall(): | ||
| 236 | c.execute(_SELECT_KEYWORD_SQL, (trigger_id,)) | ||
| 237 | triggers = ", ".join([row[0] for row in c.fetchall()]) | ||
| 238 | c.execute(_SELECT_RESPONSE_SQL, (trigger_id,)) | ||
| 239 | responses = ", ".join([row[0] for row in c.fetchall()]) | ||
| 240 | messages.append(f"**{name}**\nTriggers: {triggers}\nResponses: {responses}") | ||
| 241 | await ctx.respond("\n\n".join(messages)) | ||
| 242 | logger.info("Triggers listed") | ||
| 243 | |||
| 244 | @trigger_group.command( | ||
| 245 | description="how to use trigger group?" | ||
| 246 | ) | ||
| 247 | async def help( | ||
| 248 | self, | ||
| 249 | ctx: discord.ApplicationContext, | ||
| 250 | ): | ||
| 251 | await ctx.respond("Trigger create - creates a group for triggers/responses\n" | ||
| 252 | "Trigger add - adds triggers/responses to a group, \\ is the delimeter\n" | ||
| 253 | "Trigger remove - removes triggers/responses from a group, \\ is the delimeter\n" | ||
| 254 | "Trigger delete - deletes the whole group\n" | ||
| 255 | "Trigger list - lists triggers/responses of a group\n" | ||
| 256 | "Trigger help - display this message\n") | ||
| 257 | |||
| 258 | |||
| 259 | def setup(bot): | ||
| 260 | bot.add_cog(Trigger(bot)) | ||
