From 937c1861a05ecec7cd2f18ca3a07bc3391d6d036 Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Thu, 28 Nov 2019 17:54:36 +0100 Subject: [PATCH] Cv progress --- royalpack/commands/__init__.py | 4 +- royalpack/commands/cv.py | 217 ++++++++++++++++----------------- royalpack/events/__init__.py | 4 +- royalpack/events/discord_cv.py | 72 ++++++++++- 4 files changed, 174 insertions(+), 123 deletions(-) diff --git a/royalpack/commands/__init__.py b/royalpack/commands/__init__.py index 8d3c15e4..d5e9fe33 100644 --- a/royalpack/commands/__init__.py +++ b/royalpack/commands/__init__.py @@ -1,7 +1,7 @@ # Imports go here! from .ciaoruozi import CiaoruoziCommand from .color import ColorCommand -# from .cv import CvCommand +from .cv import CvCommand from .diario import DiarioCommand # from .rage import RageCommand # from .reminder import ReminderCommand @@ -29,7 +29,7 @@ from .peertube import PeertubeCommand available_commands = [ CiaoruoziCommand, ColorCommand, - # CvCommand, + CvCommand, DiarioCommand, # RageCommand, # ReminderCommand, diff --git a/royalpack/commands/cv.py b/royalpack/commands/cv.py index bf9f2b23..270a1bcf 100644 --- a/royalpack/commands/cv.py +++ b/royalpack/commands/cv.py @@ -1,8 +1,4 @@ -import discord -import typing from royalnet.commands import * -from royalnet.utils import andformat -from royalnet.bots import DiscordBot class CvCommand(Command): @@ -12,119 +8,110 @@ class CvCommand(Command): syntax: str = "[guildname] [all]" - @staticmethod - async def _legacy_cv_handler(bot: DiscordBot, guild_name: typing.Optional[str], everyone: bool): - # Find the matching guild - if guild_name: - guilds: typing.List[discord.Guild] = bot.client.find_guild_by_name(guild_name) - else: - guilds = bot.client.guilds - if len(guilds) == 0: - raise CommandError("No guilds with the specified name found.") - if len(guilds) > 1: - raise CommandError("Multiple guilds with the specified name found.") - guild = list(bot.client.guilds)[0] - # Edit the message, sorted by channel - discord_members = list(guild.members) - channels = {0: None} - members_in_channels = {0: []} - message = "" - # Find all the channels - for member in discord_members: - if member.voice is not None: - channel = members_in_channels.get(member.voice.channel.id) - if channel is None: - members_in_channels[member.voice.channel.id] = list() - channel = members_in_channels[member.voice.channel.id] - channels[member.voice.channel.id] = member.voice.channel - channel.append(member) - else: - members_in_channels[0].append(member) - # Edit the message, sorted by channel - for channel in sorted(channels, key=lambda c: -c): - members_in_channels[channel].sort(key=lambda x: x.nick if x.nick is not None else x.name) - if channel == 0 and len(members_in_channels[0]) > 0: - message += "[b]Non in chat vocale:[/b]\n" - else: - message += f"[b]In #{channels[channel].name}:[/b]\n" - for member in members_in_channels[channel]: - member: typing.Union[discord.User, discord.Member] - # Ignore not-connected non-notable members - if not everyone and channel == 0 and len(member.roles) < 2: - continue - # Ignore offline members - if member.status == discord.Status.offline and member.voice is None: - continue - # Online status emoji - if member.bot: - message += "๐Ÿค– " - elif member.status == discord.Status.online: - message += "๐Ÿ”ต " - elif member.status == discord.Status.idle: - message += "โšซ " - elif member.status == discord.Status.dnd: - message += "๐Ÿ”ด " - elif member.status == discord.Status.offline: - message += "โšช " - # Voice - if channel != 0: - # Voice status - if member.voice.afk: - message += "๐Ÿ’ค " - elif member.voice.self_deaf or member.voice.deaf: - message += "๐Ÿ”‡ " - elif member.voice.self_mute or member.voice.mute: - message += "๐Ÿ”ˆ " - elif member.voice.self_video or member.voice.self_stream: - message += "๐Ÿ–ฅ " - else: - message += "๐Ÿ”Š " - # Nickname - # if member.nick is not None: - # message += f"[i]{member.nick}[/i]" - # else: - message += member.name - # Game or stream - if member.activity is not None: - if member.activity.type == discord.ActivityType.playing: - message += f" | ๐ŸŽฎ {member.activity.name}" - # Rich presence - try: - if member.activity.state is not None: - message += f" ({member.activity.state}" \ - f" | {member.activity.details})" - except AttributeError: - pass - elif member.activity.type == discord.ActivityType.streaming: - message += f" | ๐Ÿ“ก {member.activity.url}" - elif member.activity.type == discord.ActivityType.listening: - if isinstance(member.activity, discord.Spotify): - if member.activity.title == member.activity.album: - message += f" | ๐ŸŽง {member.activity.title} ({andformat(member.activity.artists, final=' e ')})" - else: - message += f" | ๐ŸŽง {member.activity.title} ({member.activity.album} | {andformat(member.activity.artists, final=' e ')})" - else: - message += f" | ๐ŸŽง {member.activity.name}" - elif member.activity.type == discord.ActivityType.watching: - message += f" | ๐Ÿ“บ {member.activity.name}" - else: - message += f" | โ“ {member.activity.state}" - message += "\n" - message += "\n" - return {"response": message} - - _event_name = "_legacy_cv" + # @staticmethod + # async def _legacy_cv_handler(bot: DiscordBot, guild_name: typing.Optional[str], everyone: bool): + # # Find the matching guild + # if guild_name: + # guilds: typing.List[discord.Guild] = bot.client.find_guild_by_name(guild_name) + # else: + # guilds = bot.client.guilds + # if len(guilds) == 0: + # raise CommandError("No guilds with the specified name found.") + # if len(guilds) > 1: + # raise CommandError("Multiple guilds with the specified name found.") + # guild = list(bot.client.guilds)[0] + # # Edit the message, sorted by channel + # discord_members = list(guild.members) + # channels = {0: None} + # members_in_channels = {0: []} + # message = "" + # # Find all the channels + # for member in discord_members: + # if member.voice is not None: + # channel = members_in_channels.get(member.voice.channel.id) + # if channel is None: + # members_in_channels[member.voice.channel.id] = list() + # channel = members_in_channels[member.voice.channel.id] + # channels[member.voice.channel.id] = member.voice.channel + # channel.append(member) + # else: + # members_in_channels[0].append(member) + # # Edit the message, sorted by channel + # for channel in sorted(channels, key=lambda c: -c): + # members_in_channels[channel].sort(key=lambda x: x.nick if x.nick is not None else x.name) + # if channel == 0 and len(members_in_channels[0]) > 0: + # message += "[b]Non in chat vocale:[/b]\n" + # else: + # message += f"[b]In #{channels[channel].name}:[/b]\n" + # for member in members_in_channels[channel]: + # member: typing.Union[discord.User, discord.Member] + # # Ignore not-connected non-notable members + # if not everyone and channel == 0 and len(member.roles) < 2: + # continue + # # Ignore offline members + # if member.status == discord.Status.offline and member.voice is None: + # continue + # # Online status emoji + # if member.bot: + # message += "๐Ÿค– " + # elif member.status == discord.Status.online: + # message += "๐Ÿ”ต " + # elif member.status == discord.Status.idle: + # message += "โšซ " + # elif member.status == discord.Status.dnd: + # message += "๐Ÿ”ด " + # elif member.status == discord.Status.offline: + # message += "โšช " + # # Voice + # if channel != 0: + # # Voice status + # if member.voice.afk: + # message += "๐Ÿ’ค " + # elif member.voice.self_deaf or member.voice.deaf: + # message += "๐Ÿ”‡ " + # elif member.voice.self_mute or member.voice.mute: + # message += "๐Ÿ”ˆ " + # elif member.voice.self_video or member.voice.self_stream: + # message += "๐Ÿ–ฅ " + # else: + # message += "๐Ÿ”Š " + # # Nickname + # # if member.nick is not None: + # # message += f"[i]{member.nick}[/i]" + # # else: + # message += member.name + # # Game or stream + # if member.activity is not None: + # if member.activity.type == discord.ActivityType.playing: + # message += f" | ๐ŸŽฎ {member.activity.name}" + # # Rich presence + # try: + # if member.activity.state is not None: + # message += f" ({member.activity.state}" \ + # f" | {member.activity.details})" + # except AttributeError: + # pass + # elif member.activity.type == discord.ActivityType.streaming: + # message += f" | ๐Ÿ“ก {member.activity.url}" + # elif member.activity.type == discord.ActivityType.listening: + # if isinstance(member.activity, discord.Spotify): + # if member.activity.title == member.activity.album: + # message += f" | ๐ŸŽง {member.activity.title} ({andformat(member.activity.artists, final=' e ')})" + # else: + # message += f" | ๐ŸŽง {member.activity.title} ({member.activity.album} | {andformat(member.activity.artists, final=' e ')})" + # else: + # message += f" | ๐ŸŽง {member.activity.name}" + # elif member.activity.type == discord.ActivityType.watching: + # message += f" | ๐Ÿ“บ {member.activity.name}" + # else: + # message += f" | โ“ {member.activity.state}" + # message += "\n" + # message += "\n" + # return {"response": message} def __init__(self, interface: CommandInterface): super().__init__(interface) - if interface.name == "discord": - interface.register_herald_action(self._event_name, self._legacy_cv_handler) async def run(self, args: CommandArgs, data: CommandData) -> None: - # noinspection PyTypeChecker - guild_name, everyone = args.match(r"(?:\[(.+)])?\s*(\S+)?\s*") - response = await self.interface.call_herald_action("discord", self._event_name, { - "guild_name": guild_name, - "everyone": everyone - }) - await data.reply(response["response"]) + response = await self.interface.call_herald_event("discord", "discord_cv") + breakpoint() diff --git a/royalpack/events/__init__.py b/royalpack/events/__init__.py index a591fe69..534dee96 100644 --- a/royalpack/events/__init__.py +++ b/royalpack/events/__init__.py @@ -1,9 +1,9 @@ # Imports go here! - +from .discord_cv import DiscordCvEvent # Enter the commands of your Pack here! available_events = [ - + DiscordCvEvent, ] # noinspection PyUnreachableCode diff --git a/royalpack/events/discord_cv.py b/royalpack/events/discord_cv.py index 9fd5d536..59b87609 100644 --- a/royalpack/events/discord_cv.py +++ b/royalpack/events/discord_cv.py @@ -7,11 +7,75 @@ from royalnet.commands import * class DiscordCvEvent(Event): name = "discord_cv" - def run(self, guild_id: int, **kwargs): + async def run(self, guild_id: Optional[int] = None, **kwargs): if not self.interface.name == "discord": raise UnsupportedError() + + # noinspection PyTypeChecker serf: DiscordSerf = self.interface.serf + client: discord.Client = serf.client - guild: discord.Guild = client.get_guild(guild_id) - members: List[discord.Member] = guild.members - ... + + if guild_id is None: + guilds: List[discord.Guild] = client.guilds + if len(guilds) == 0: + raise ConfigurationError("Il bot non รจ in nessun Server.") + elif len(guilds) > 1: + raise UserError("Non hai specificato di quale Server vuoi vedere le informazioni!") + else: + guild = guilds[0] + else: + guild: discord.Guild = client.get_guild(guild_id) + + members: List[Union[discord.User, discord.Member]] = guild.members + channels: List[discord.VoiceChannel] = guild.voice_channels + + results = [] + + for member in members: + data = { + "id": member.id, + "name": member.name, + "discriminator": member.discriminator, + "nick": member.nick, + "bot": member.bot, + "voice": { + "channel": { + "id": member.voice.channel.id, + "name": member.voice.channel.name, + "position": member.voice.channel.position, + "category": { + "id": member.voice.channel.category_id, + "name": member.voice.channel.category.name, + }, + "bitrate": member.voice.channel.bitrate, + "user_limit": member.voice.channel.user_limit, + }, + "server_mute": member.voice.mute, + "server_deaf": member.voice.deaf, + "self_mute": member.voice.self_mute, + "self_deaf": member.voice.self_deaf, + "video": member.voice.self_video, + "golive": member.voice.self_stream, + "afk": member.voice.afk, + } if member.voice is not None else None, + "status": { + "main": member.status, + "desktop": member.desktop_status, + "mobile": member.mobile_status, + "web": member.web_status, + }, + "activities": [activity.to_dict() for activity in member.activities if activity is not None], + "roles": [{ + "id": role.id, + "name": role.name, + "hoist": role.hoist, + "position": role.position, + "managed": role.managed, + "mentionable": role.mentionable, + } for role in member.roles] + } + + results.append(data) + + return results