aboutsummaryrefslogtreecommitdiffstats
path: root/cogs/trigger.py
diff options
context:
space:
mode:
Diffstat (limited to 'cogs/trigger.py')
-rw-r--r--cogs/trigger.py260
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
6import os
7import discord
8from discord.ext import commands
9import random
10import logging
11
12from cogs.utils.database import get_connection, init_database
13
14logger = logging.getLogger(__name__)
15
16init_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
25class 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
259def setup(bot):
260 bot.add_cog(Trigger(bot))