mirror of
https://github.com/TitanEmbeds/Titan.git
synced 2025-06-16 11:25:22 +02:00
Remove guild members table for storing in redis
This commit is contained in:
@ -105,23 +105,6 @@ class Titan(discord.AutoShardedClient):
|
||||
|
||||
async def on_guild_join(self, guild):
|
||||
await self.database.update_guild(guild)
|
||||
for member in guild.members:
|
||||
await self.database.update_guild_member(member, True, False)
|
||||
if guild.me.guild_permissions.ban_members:
|
||||
banned = await guild.bans()
|
||||
for ban in banned:
|
||||
member = discord.Member(user={
|
||||
"username": ban.name,
|
||||
"id": ban.id,
|
||||
"discriminator": ban.discriminator,
|
||||
"avatar": ban.avatar,
|
||||
"bot": ban.bot
|
||||
})
|
||||
await self.database.update_guild_member(member, False, True)
|
||||
for channel in list(guild.channels):
|
||||
chanperm = channel.permissions_for(channel.guild.me)
|
||||
if not chanperm.read_messages or not chanperm.read_message_history or not isinstance(channel, discord.channel.TextChannel):
|
||||
continue
|
||||
await self.postStats()
|
||||
|
||||
async def on_guild_remove(self, guild):
|
||||
@ -163,24 +146,21 @@ class Titan(discord.AutoShardedClient):
|
||||
await self.socketio.on_channel_update(channelafter)
|
||||
|
||||
async def on_member_join(self, member):
|
||||
await self.database.update_guild_member(member, active=True, banned=False)
|
||||
await self.redisqueue.add_member(member)
|
||||
await self.socketio.on_guild_member_add(member)
|
||||
|
||||
async def on_member_remove(self, member):
|
||||
await self.database.update_guild_member(member, active=False, banned=False)
|
||||
await self.redisqueue.remove_member(member)
|
||||
await self.socketio.on_guild_member_remove(member)
|
||||
|
||||
async def on_member_update(self, memberbefore, memberafter):
|
||||
await self.database.update_guild_member(memberafter)
|
||||
await self.redisqueue.update_member(memberafter)
|
||||
await self.socketio.on_guild_member_update(memberafter)
|
||||
|
||||
async def on_member_ban(self, guild, user):
|
||||
if self.user.id == user.id:
|
||||
return
|
||||
await self.database.update_guild_member(user, active=False, banned=True, guild=guild)
|
||||
|
||||
async def on_member_unban(self, guild, user):
|
||||
await self.database.unban_server_user(user, guild)
|
||||
await self.redisqueue.ban_member(guild, user)
|
||||
|
||||
async def on_guild_emojis_update(self, guild, before, after):
|
||||
if len(after) == 0:
|
||||
|
@ -6,7 +6,6 @@ import datetime
|
||||
db = Gino()
|
||||
|
||||
from titanembeds.database.guilds import Guilds
|
||||
from titanembeds.database.guild_members import GuildMembers
|
||||
from titanembeds.database.unauthenticated_users import UnauthenticatedUsers
|
||||
from titanembeds.database.unauthenticated_bans import UnauthenticatedBans
|
||||
|
||||
@ -70,82 +69,6 @@ class DatabaseInterface(object):
|
||||
if gui:
|
||||
await Messages.delete.where(Messages.guild_id == int(guild.id)).gino.status()
|
||||
await gui.delete()
|
||||
|
||||
async def update_guild_member(self, member, active=True, banned=False, guild=None):
|
||||
if guild:
|
||||
dbmember = await GuildMembers.query \
|
||||
.where(GuildMembers.guild_id == int(guild.id)) \
|
||||
.where(GuildMembers.user_id == int(member.id)) \
|
||||
.order_by(GuildMembers.id).gino.all()
|
||||
else:
|
||||
dbmember = await GuildMembers.query \
|
||||
.where(GuildMembers.guild_id == int(member.guild.id)) \
|
||||
.where(GuildMembers.user_id == int(member.id)) \
|
||||
.order_by(GuildMembers.id).gino.all()
|
||||
if not dbmember:
|
||||
await GuildMembers.create(
|
||||
guild_id = int(member.guild.id),
|
||||
user_id = int(member.id),
|
||||
username = member.name,
|
||||
discriminator = int(member.discriminator),
|
||||
nickname = member.nick,
|
||||
avatar = member.avatar,
|
||||
active = active,
|
||||
banned = banned,
|
||||
roles = json.dumps(list_role_ids(member.roles))
|
||||
)
|
||||
else:
|
||||
if len(dbmember) > 1:
|
||||
for mem in dbmember[1:]:
|
||||
await mem.delete()
|
||||
dbmember = dbmember[0]
|
||||
if dbmember.banned != banned or dbmember.active != active or dbmember.username != member.name or dbmember.discriminator != int(member.discriminator) or dbmember.nickname != member.nick or dbmember.avatar != member.avatar or set(json.loads(dbmember.roles)) != set(list_role_ids(member.roles)):
|
||||
await dbmember.update(
|
||||
banned = banned,
|
||||
active = active,
|
||||
username = member.name,
|
||||
discriminator = int(member.discriminator),
|
||||
nickname = member.nick,
|
||||
avatar = member.avatar,
|
||||
roles = json.dumps(list_role_ids(member.roles))
|
||||
).apply()
|
||||
|
||||
async def unban_server_user(self, user, server):
|
||||
await GuildMembers.update.values(banned = False) \
|
||||
.where(GuildMembers.guild_id == int(server.id)) \
|
||||
.where(GuildMembers.user_id == int(user.id)) \
|
||||
.gino.status()
|
||||
|
||||
|
||||
async def flag_unactive_guild_members(self, guild_id, guild_members):
|
||||
async with db.transaction():
|
||||
async for member in GuildMembers.query \
|
||||
.where(GuildMembers.guild_id == int(guild_id)) \
|
||||
.where(GuildMembers.active == True).gino.iterate():
|
||||
dismember = discord.utils.get(guild_members, id=member.user_id)
|
||||
if not dismember:
|
||||
await member.update(active = False).apply()
|
||||
|
||||
async def flag_unactive_bans(self, guild_id, guildbans):
|
||||
for usr in guildbans:
|
||||
dbusr = await GuildMembers.query \
|
||||
.where(GuildMembers.guild_id == int(guild_id)) \
|
||||
.where(GuildMembers.user_id == int(usr.id)) \
|
||||
.where(GuildMembers.active == False).gino.first()
|
||||
if dbusr:
|
||||
dbusr.update(banned=True).apply()
|
||||
else:
|
||||
await GuildMembers.create(
|
||||
guild_id = int(guild_id),
|
||||
user_id = int(usr.id),
|
||||
username = usr.name,
|
||||
discriminator = int(usr.discriminator),
|
||||
nickname = None,
|
||||
avatar = usr.avatar,
|
||||
active = False,
|
||||
banned = True,
|
||||
roles = "[]"
|
||||
)
|
||||
|
||||
async def ban_unauth_user_by_query(self, guild_id, placer_id, username, discriminator):
|
||||
dbuser = None
|
||||
|
@ -1,14 +0,0 @@
|
||||
from titanembeds.database import db
|
||||
|
||||
class GuildMembers(db.Model):
|
||||
__tablename__ = "guild_members"
|
||||
id = db.Column(db.Integer, primary_key=True) # Auto incremented id
|
||||
guild_id = db.Column(db.BigInteger) # Discord guild id
|
||||
user_id = db.Column(db.BigInteger) # Discord user id
|
||||
username = db.Column(db.String(255)) # Name
|
||||
discriminator = db.Column(db.Integer) # User discriminator
|
||||
nickname = db.Column(db.String(255)) # User nickname
|
||||
avatar = db.Column(db.String(255)) # The avatar str of the user
|
||||
active = db.Column(db.Boolean()) # If the user is a member of the guild
|
||||
banned = db.Column(db.Boolean()) # If the user is banned in the guild
|
||||
roles = db.Column(db.Text()) # Member roles
|
@ -1,4 +1,4 @@
|
||||
from titanembeds.utils import get_formatted_message
|
||||
from titanembeds.utils import get_formatted_message, get_formatted_user
|
||||
from urllib.parse import urlparse
|
||||
import asyncio_redis
|
||||
import json
|
||||
@ -77,6 +77,15 @@ class RedisQueue:
|
||||
break
|
||||
return (unformatted_item, formatted_item)
|
||||
|
||||
async def enforce_expiring_key(self, key):
|
||||
ttl = await self.connection.ttl(key)
|
||||
newttl = 0
|
||||
if ttl == -1:
|
||||
newttl = 60 * 5 # 5 minutes
|
||||
if ttl >= 0:
|
||||
newttl = ttl
|
||||
await self.connection.expire(key, newttl)
|
||||
|
||||
async def on_get_channel_messages(self, key, params):
|
||||
channel = self.bot.get_channel(int(params["channel_id"]))
|
||||
if not channel or not isinstance(channel, discord.channel.TextChannel):
|
||||
@ -86,7 +95,7 @@ class RedisQueue:
|
||||
async for message in channel.history(limit=50):
|
||||
formatted = get_formatted_message(message)
|
||||
messages.append(json.dumps(formatted))
|
||||
await self.connection.sadd(key, messages)
|
||||
await self.connection.sadd(key, [""] + messages)
|
||||
|
||||
async def push_message(self, message):
|
||||
if message.guild:
|
||||
@ -107,4 +116,65 @@ class RedisQueue:
|
||||
|
||||
async def update_message(self, message):
|
||||
await self.delete_message(message)
|
||||
await self.push_message(message)
|
||||
await self.push_message(message)
|
||||
|
||||
async def on_get_guild_member(self, key, params):
|
||||
member = self.bot.get_guild(int(params["guild_id"])).get_member(int(params["user_id"]))
|
||||
if not member:
|
||||
await self.connection.set(key, "")
|
||||
return
|
||||
user = get_formatted_user(member)
|
||||
await self.enforce_expiring_key(key)
|
||||
await self.connection.set(key, json.dumps(user))
|
||||
|
||||
async def on_get_guild_member_named(self, key, params):
|
||||
guild = self.bot.get_guild(int(params["guild_id"]))
|
||||
query = params["query"]
|
||||
result = None
|
||||
members = guild.members
|
||||
if len(query) > 5 and query[-5] == '#':
|
||||
potential_discriminator = query[-4:]
|
||||
result = discord.utils.get(members, name=query[:-5], discriminator=potential_discriminator)
|
||||
if not result:
|
||||
result = discord.utils.get(members, nick=query[:-5], discriminator=potential_discriminator)
|
||||
if not result:
|
||||
result = ""
|
||||
else:
|
||||
result_id = result.id
|
||||
result = json.dumps({"user_id": result_id})
|
||||
get_guild_member_key = "Queue/guilds/{}/members/{}".format(guild.id, result_id)
|
||||
get_guild_member_param = {"guild_id": guild.id, "user_id": result_id}
|
||||
await self.on_get_guild_member(get_guild_member_key, get_guild_member_param)
|
||||
await self.connection.set(key, result)
|
||||
|
||||
async def on_list_guild_members(self, key, params):
|
||||
guild = self.bot.get_guild(int(params["guild_id"]))
|
||||
members = guild.members
|
||||
member_ids = []
|
||||
for member in members:
|
||||
member_ids.append(json.dumps({"user_id": member.id}))
|
||||
get_guild_member_key = "Queue/guilds/{}/members/{}".format(guild.id, member.id)
|
||||
get_guild_member_param = {"guild_id": guild.id, "user_id": member.id}
|
||||
await self.on_get_guild_member(get_guild_member_key, get_guild_member_param)
|
||||
await self.connection.sadd(key, member_ids)
|
||||
|
||||
async def add_member(self, member):
|
||||
key = "Queue/guilds/{}/members".format(member.guild.id)
|
||||
exists = await self.connection.exists(key)
|
||||
if exists:
|
||||
await self.connection.sadd(key, [json.dumps({"user_id": member.id})])
|
||||
|
||||
async def remove_member(self, member, guild=None):
|
||||
if not guild:
|
||||
guild = member.guild
|
||||
guild_member_key = "Queue/guilds/{}/members/{}".format(guild.id, member.id)
|
||||
list_members_key = "Queue/guilds/{}/members".format(guild.id)
|
||||
await self.connection.srem(list_members_key, [json.dumps({"user_id": member.id})])
|
||||
await self.connection.delete([guild_member_key])
|
||||
|
||||
async def update_member(self, member):
|
||||
await self.remove_member(member)
|
||||
await self.add_member(member)
|
||||
|
||||
async def ban_member(self, guild, user):
|
||||
await self.remove_member(user, guild)
|
@ -50,6 +50,8 @@ def get_formatted_user(user):
|
||||
"status": str(user.status),
|
||||
"username": user.name,
|
||||
"nick": None,
|
||||
"bot": user.bot,
|
||||
"roles": []
|
||||
}
|
||||
if userobj["color"] == "000000":
|
||||
userobj["color"] = None
|
||||
@ -63,13 +65,13 @@ def get_formatted_user(user):
|
||||
}
|
||||
roles = sorted(user.roles, key=lambda k: k.position, reverse=True)
|
||||
for role in roles:
|
||||
if role.hoist:
|
||||
userobj["roles"].append(role.id)
|
||||
if role.hoist and userobj["hoist-role"] == None:
|
||||
userobj["hoist-role"] = {
|
||||
"id": str(role.id),
|
||||
"name": role.name,
|
||||
"position": role.position,
|
||||
}
|
||||
break
|
||||
return userobj
|
||||
|
||||
def get_message_author(message):
|
||||
|
Reference in New Issue
Block a user