root 3 роки тому
батько
коміт
b346273baa
4 змінених файлів з 87 додано та 29 видалено
  1. 4 3
      bot/commands/games.py
  2. 42 8
      bot/events/general.py
  3. 1 0
      bot/query/initialise_database.py
  4. 40 18
      bot/query/user.py

+ 4 - 3
bot/commands/games.py

@@ -3,7 +3,7 @@ import discord
 import random
 from typing import Optional
 from query.channel import get_games
-from query.user import is_ignored, get_level, get_xp, level_up, get_ability_points_spent, increment_all_coin, get_coin
+from query.user import is_ignored, get_level, get_xp, level_up, get_ability_points_spent, increment_all_coin, get_coin, get_karma
 from local_settings import COMMAND_PREFIX
 
 def setup(bot: commands.Bot):
@@ -44,10 +44,11 @@ class Games(commands.Cog):
 			xp_spent, total_xp = await get_xp(self.bot.pg, user.id)
 			ability_points_spent = await get_ability_points_spent(self.bot.pg, user.id)
 			coin = await get_coin(self.bot.pg, user.id)
+			karma = await get_karma(self.bot.pg, user.id)
 			if ctx.author == user:
-				await ctx.send(f"You rank at level {level}. (exp {xp_spent}/{total_xp} | abp {ability_points_spent}/{level * 3} | coin {coin})")
+				await ctx.send(f"You rank at level **{level}**. (exp **{xp_spent}**/{total_xp} | abp **{ability_points_spent}**/{level * 3} | coin **{coin}** | karma **{karma}**)")
 			else:
-				await ctx.send(f"`{user}` ranks at level **{level}**. (**{xp_spent}**/{total_xp} | abp {ability_points_spent}/{level * 3}) | coin {coin}")
+				await ctx.send(f"`{user}` ranks at level **{level}**. (**{xp_spent}**/{total_xp} | abp **{ability_points_spent}**/{level * 3}) | coin **{coin}** | karma **{karma}**")
 
 	@commands.command(
 		description="Check the experience points for a player.",

+ 42 - 8
bot/events/general.py

@@ -1,10 +1,10 @@
-import logging, discord, asyncpg, random, sys
+import logging, discord, asyncpg, random, sys, datetime
 
 from discord.ext import commands
 from query.guild import update_guild, get_report_deleted, get_output_channel, get_report_edited
 from query.channel import insert_channel, get_interact
 from query.channel_user import upsert_total_messages
-from query.user import create_user, created_invite, created_integration, member_updated, user_updated, member_banned, member_unbanned, presence_updated, message_edited, message_deleted, reacted, event_created, event_joined, thread_created, thread_joined
+from query.user import create_user, created_invite, created_integration, member_updated, user_updated, member_banned, member_unbanned, presence_updated, message_edited, message_deleted, reacted, event_created, event_joined, thread_created, joined_thread, deleted_invite, member_joined, unreacted, event_parted, thread_deleted, left_thread
 from common.logging import report
 
 def setup(bot: commands.Bot):
@@ -15,7 +15,8 @@ class General(commands.Cog):
 
 	def __init__(self, bot: commands.Bot):
 		self.bot = bot
-		self.last_msg = None
+		self.last_deleted_msg = None
+		self.cooldown_list = {}
 
 	@commands.Cog.listener()
 	async def on_raw_app_command_permissions_update(self, payload):
@@ -90,10 +91,18 @@ class General(commands.Cog):
 	async def on_invite_create(self, invite: discord.Invite):
 		await created_invite(self.bot.pg, invite.inviter.id)
 
+	@commands.Cog.listener()
+	async def on_invite_delete(self, invite: discord.Invite):
+		await deleted_invite(self.bot.pg, invite.inviter.id)
+
 	@commands.Cog.listener()
 	async def on_integration_create(self, integration: discord.Integration):
 		await created_integration(self.bot.pg, integration.user.id)
 
+	@commands.Cog.listener()
+	async def on_member_join(self, member):
+		await member_joined(self.bot.pg, member.id)
+
 	@commands.Cog.listener()
 	async def on_member_update(self, before):
 		await member_updated(self.bot.pg, before.id)
@@ -139,6 +148,15 @@ class General(commands.Cog):
 		# Respond when mentioned
 		if self.bot.user.mentioned_in(message):
 			if isinstance(message.channel, discord.channel.DMChannel) or await get_interact(self.bot.pg, message.channel.id):
+
+				# Only respond every X seconds in public places.
+				if message.guild:  # Ignore DM's
+					if not message.channel.id in self.cooldown_list:
+						pass
+					elif self.cooldown_list[message.channel.id] > datetime.datetime.now() - datetime.timedelta(seconds=12):
+						return
+					self.cooldown_list[message.channel.id] = datetime.datetime.now()
+
 				messages = [
 					f"Hello {message.author.mention}. <3",
 					f"How are you today {message.author.mention}?",
@@ -190,7 +208,7 @@ class General(commands.Cog):
 				   f"Message from {message.author}, in {message.channel} deleted: {message}")
 
 		# !snipe
-		self.last_msg = message
+		self.last_deleted_msg = message
 
 	@commands.Cog.listener()
 	async def on_raw_member_remove(self, payload):
@@ -200,6 +218,10 @@ class General(commands.Cog):
 	async def on_reaction_add(self, reaction, user):
 		reacted(self.bot.pg, user.id)
 
+	@commands.Cog.listener()
+	async def on_reaction_remove(self, reaction, user):
+		unreacted(self.bot.pg, user.id)
+
 	@commands.Cog.listener()
 	async def on_scheduled_event_create(self, event):
 		event_created(self.bot.pg, event.creator.id)
@@ -208,13 +230,25 @@ class General(commands.Cog):
 	async def on_scheduled_event_user_add(self, event, user):
 		event_joined(self.bot.pg, user.id)
 
+	@commands.Cog.listener()
+	async def on_scheduled_event_user_remove(self, event, user):
+		event_parted(self.bot.pg, user.id)
+
 	@commands.Cog.listener()
 	async def on_thread_create(self, thread):
 		thread_created(self.bot.pg, thread.owner.id)
 
+	@commands.Cog.listener()
+	async def on_thread_delete(self, thread):
+		thread_deleted(self.bot.pg, thread.owner.id)
+
 	@commands.Cog.listener()
 	async def on_thread_member_join(self, member: discord.User):
-		thread_joined(self.bot.pg, member.id)
+		joined_thread(self.bot.pg, member.id)
+
+	@commands.Cog.listener()
+	async def on_thread_member_remove(self, member: discord.User):
+		left_thread(self.bot.pg, member.id)
 
 
 
@@ -222,12 +256,12 @@ class General(commands.Cog):
 	@commands.command(name="snipe")
 	async def snipe(self, ctx: commands.Context):
 		"""A command to snipe delete messages."""
-		if not self.last_msg:  # on_message_delete hasn't been triggered since the bot started
+		if not self.last_deteled_msg:  # on_message_delete hasn't been triggered since the bot started
 			await ctx.send("There is no message to snipe!")
 			return
 
-		author = self.last_msg.author
-		content = self.last_msg.content
+		author = self.last_deleted_msg.author
+		content = self.last_deleted_msg.content
 
 		embed = discord.Embed(title=f"Message from {author}", description=content)
 		await ctx.send(embed=embed)

+ 1 - 0
bot/query/initialise_database.py

@@ -54,6 +54,7 @@ async def init_db(pg):
                 threads_joined INT DEFAULT 0, \
                 ability_points_spent INT DEFAULT 0, \
                 coin INT DEFAULT 0, \
+                karma INT DEFAULT 0, \
                 created TIMESTAMP NOT NULL DEFAULT now()\
             )\
         ",

+ 40 - 18
bot/query/user.py

@@ -20,7 +20,7 @@ async def get_xp(pg, user_id):
 		total_xp += messages[0]
 
 	extras_array = await pg.fetch("SELECT invites_created, integrations_created, member_updated, user_updated, member_banned, member_unbanned, presence_updated, messages_edited, messages_deleted, reacted, events_created, events_joined, threads_created, threads_joined FROM \"user\" WHERE user_id = $1", user_id)
-	invites_created, integrations_created, member_updated, user_updated, member_banned, member_unbanned, presence_updated, messages_edited, messages_deleted, reacted, events_created, events_joined, threads_created, threads_joined = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+	invites_created, integrations_created, member_updated, user_updated, member_banned, member_unbanned, presence_updated, messages_edited, messages_deleted, reacted, events_created, events_joined, threads_created, threads_joined = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 	for extra in extras_array:
 		invites_created += extra[0]
 		integrations_created += extra[1]
@@ -46,54 +46,76 @@ async def level_up(pg, user_id, xp):
 	await pg.execute("UPDATE \"user\" SET (level, xp_spent) = (+ 1, $2) WHERE user_id = $1", user_id, xp)
 
 async def created_invite(pg, user_id):
-	await pg.execute("UPDATE \"user\" SET (invites_created) = (+ 1) WHERE user_id = $1", user_id)
+	await pg.execute("UPDATE \"user\" SET (invites_created, karma) = (+1, +1) WHERE user_id = $1", user_id)
+
+async def deleted_invite(pg, user_id):
+	await pg.execute("UPDATE \"user\" SET karma = -1 WHERE user_id = $1", user_id)
+
 async def invites_created(pg, user_id):
 	return await pg.fetchval("SELECT invites_created FROM \"user\" WHERE user_id = $1", user_id)
 
 async def created_integration(pg, user_id):
-	await pg.execute("UPDATE \"user\" SET (integrations_created) = (+ 1) WHERE user_id = $1", user_id)
+	await pg.execute("UPDATE \"user\" SET integrations_created = +1 WHERE user_id = $1", user_id)
+
+async def member_joined(pg, user_id):
+	await pg.execute("UPDATE \"user\" SET karma = +1 WHERE user_id = $1", user_id)
 
 async def member_updated(pg, user_id):
-	await pg.execute("UPDATE \"user\" SET (member_updated) = (+ 1) WHERE user_id = $1", user_id)
+	await pg.execute("UPDATE \"user\" SET member_updated = +1 WHERE user_id = $1", user_id)
 
 async def user_updated(pg, user_id):
-	await pg.execute("UPDATE \"user\" SET (user_updated) = (+ 1) WHERE user_id = $1", user_id)
+	await pg.execute("UPDATE \"user\" SET user_updated = +1 WHERE user_id = $1", user_id)
 
 async def member_banned(pg, user_id):
-	await pg.execute("UPDATE \"user\" SET (member_banned) = (+ 1) WHERE user_id = $1", user_id)
+	await pg.execute("UPDATE \"user\" SET (member_banned, karma) = (+1, -1) WHERE user_id = $1", user_id)
 
 async def member_unbanned(pg, user_id):
-	await pg.execute("UPDATE \"user\" SET (member_unbanned) = (+ 1) WHERE user_id = $1", user_id)
+	await pg.execute("UPDATE \"user\" SET member_unbanned = +1 WHERE user_id = $1", user_id)
 
 async def presence_updated(pg, user_id):
-	await pg.execute("UPDATE \"user\" SET (presence_updated) = (+ 1) WHERE user_id = $1", user_id)
+	await pg.execute("UPDATE \"user\" SET presence_updated = +1 WHERE user_id = $1", user_id)
 
 async def message_edited(pg, user_id):
-	await pg.execute("UPDATE \"user\" SET (messages_edited) = (+ 1) WHERE user_id = $1", user_id)
+	await pg.execute("UPDATE \"user\" SET (messages_edited, karma) = (+1, +1) WHERE user_id = $1", user_id)
 
 async def message_deleted(pg, user_id):
-	await pg.execute("UPDATE \"user\" SET (messages_deleted) = (+ 1) WHERE user_id = $1", user_id)
+	await pg.execute("UPDATE \"user\" SET (messages_deleted, karma) = (+1, -1) WHERE user_id = $1", user_id)
 
 async def reacted(pg, user_id):
-	await pg.execute("UPDATE \"user\" SET (reacted) = (+ 1) WHERE user_id = $1", user_id)
+	await pg.execute("UPDATE \"user\" SET (reacted, karma) = (+1, +1) WHERE user_id = $1", user_id)
+
+async def unreacted(pg, user_id):
+	await pg.execute("UPDATE \"user\" SET karma = -1 WHERE user_id = $1", user_id)
 
 async def event_created(pg, user_id):
-	await pg.execute("UPDATE \"user\" SET (events_created) = (+ 1) WHERE user_id = $1", user_id)
+	await pg.execute("UPDATE \"user\" SET (events_created, karma) = (+1, +1) WHERE user_id = $1", user_id)
 
 async def event_joined(pg, user_id):
-	await pg.execute("UPDATE \"user\" SET (events_joined) = (+ 1) WHERE user_id = $1", user_id)
+	await pg.execute("UPDATE \"user\" SET (events_joined, karma) = (+1, +1) WHERE user_id = $1", user_id)
+
+async def event_parted(pg, user_id):
+	await pg.execute("UPDATE \"user\" SET karma = -1 WHERE user_id = $1", user_id)
 
 async def thread_created(pg, user_id):
-	await pg.execute("UPDATE \"user\" SET (threads_created) = (+ 1) WHERE user_id = $1", user_id)
+	await pg.execute("UPDATE \"user\" SET (threads_created, karma) = (+1, +1) WHERE user_id = $1", user_id)
+
+async def thread_deleted(pg, user_id):
+	await pg.execute("UPDATE \"user\" SET karma = - 1 WHERE user_id = $1", user_id)
 
-async def thread_joined(pg, user_id):
-	await pg.execute("UPDATE \"user\" SET (threads_joined) = (+ 1) WHERE user_id = $1", user_id)
+async def joined_thread(pg, user_id):
+	await pg.execute("UPDATE \"user\" SET (threads_joined, karma) = (+1, +1) WHERE user_id = $1", user_id)
+
+async def left_thread(pg, user_id):
+	await pg.execute("UPDATE \"user\" SET karma = -1 WHERE user_id = $1", user_id)
 
 async def get_ability_points_spent(pg, user_id):
 	return await pg.fetchval("SELECT ability_points_spent FROM \"user\" WHERE user_id = $1", user_id)
 
 async def increment_all_coin(pg):
-	await pg.execute("UPDATE \"user\" SET (coin) = (+ 1) WHERE level > 0")
+	await pg.execute("UPDATE \"user\" SET coin = + 1 WHERE level > 0")
 
 async def get_coin(pg, user_id):
-	return await pg.fetchval("SELECT coin FROM \"user\" WHERE user_id = $1", user_id)
+	return await pg.fetchval("SELECT coin FROM \"user\" WHERE user_id = $1", user_id)
+
+async def get_karma(pg, user_id):
+	return await pg.fetchval("SELECT karma FROM \"user\" WHERE user_id = $1", user_id)