|
| 1 | +# Futures |
| 2 | +# Built-in/Generic Imports |
| 3 | +# Libs |
| 4 | +from typing import List |
| 5 | + |
| 6 | +import discord |
| 7 | +from aiohttp import web |
| 8 | +from discord.ext.commands import Bot |
| 9 | + |
| 10 | +import koalabot |
| 11 | +from koala.rest.api import parse_request |
| 12 | + |
| 13 | +# Own modules |
| 14 | +from . import core |
| 15 | +from .dto import ReactRole |
| 16 | +from .log import logger |
| 17 | +from ... import colours |
| 18 | + |
| 19 | +# Constants |
| 20 | +RFR_ENDPOINT = 'react-for-role' |
| 21 | + |
| 22 | +MESSAGE = 'message' |
| 23 | +REQUIRED_ROLES = 'required-roles' |
| 24 | + |
| 25 | + |
| 26 | +class RfrEndpoint: |
| 27 | + _bot: koalabot.KoalaBot |
| 28 | + """ |
| 29 | + The API endpoints for BaseCog |
| 30 | + """ |
| 31 | + |
| 32 | + def __init__(self, bot): |
| 33 | + self._bot = bot |
| 34 | + |
| 35 | + def register(self, app): |
| 36 | + """ |
| 37 | + Register the routes for the given application |
| 38 | + :param app: The aiohttp.web.Application (likely of the sub app) |
| 39 | + :return: app |
| 40 | + """ |
| 41 | + app.add_routes([web.post('/{}'.format(MESSAGE), self.post_message), |
| 42 | + web.get('/{}'.format(MESSAGE), self.get_message), |
| 43 | + web.put('/{}'.format(MESSAGE), self.put_message), |
| 44 | + web.patch('/{}'.format(MESSAGE), self.patch_message), |
| 45 | + web.delete('/{}'.format(MESSAGE), self.delete_message), |
| 46 | + web.put('/{}'.format(REQUIRED_ROLES), self.put_required_roles), |
| 47 | + web.get('/{}'.format(REQUIRED_ROLES), self.get_required_roles)]) |
| 48 | + return app |
| 49 | + |
| 50 | + @parse_request |
| 51 | + async def post_message(self, |
| 52 | + guild_id: int, |
| 53 | + channel_id: int, |
| 54 | + title: str, |
| 55 | + description: str = "", |
| 56 | + colour: str = colours.KOALA_GREEN.__str__(), |
| 57 | + thumbnail: str = None, |
| 58 | + inline: bool = None, |
| 59 | + roles: List[dict] = None |
| 60 | + ): |
| 61 | + """ |
| 62 | + Create a React For Role message |
| 63 | +
|
| 64 | + :param guild_id: Guild ID of RFR message |
| 65 | + :param channel_id: Channel ID of RFR message |
| 66 | + :param title: Title of RFR message |
| 67 | + :param description: Description of RFR message |
| 68 | + :param colour: Hex colour code of RFR message |
| 69 | + :param thumbnail: thumbnail URL |
| 70 | + :param inline: fields should be inline |
| 71 | + :param roles: roles for RFR message |
| 72 | + :return: |
| 73 | + """ |
| 74 | + guild = self._bot.get_guild(guild_id) |
| 75 | + if roles is not None: |
| 76 | + roles = [ReactRole(r["emoji"], r["role_id"]).to_tuple(guild) for r in roles] |
| 77 | + |
| 78 | + return await core.create_rfr_message(bot=self._bot, |
| 79 | + guild_id=guild_id, |
| 80 | + channel_id=channel_id, |
| 81 | + title=title, |
| 82 | + description=description, |
| 83 | + colour=discord.Colour.from_str(colour), |
| 84 | + thumbnail=thumbnail, |
| 85 | + inline=inline, |
| 86 | + roles=roles) |
| 87 | + |
| 88 | + @parse_request |
| 89 | + async def get_message(self, |
| 90 | + message_id: int, |
| 91 | + guild_id: int, |
| 92 | + channel_id: int |
| 93 | + ): |
| 94 | + """ |
| 95 | + Get a React For Role message |
| 96 | +
|
| 97 | + :param message_id: Message ID of RFR message |
| 98 | + :param guild_id: Guild ID of RFR message |
| 99 | + :param channel_id: Channel ID of RFR message |
| 100 | + :return: |
| 101 | + """ |
| 102 | + return await core.get_rfr_message_dto(self._bot, int(message_id), int(guild_id), int(channel_id)) |
| 103 | + |
| 104 | + @parse_request |
| 105 | + async def put_message(self, |
| 106 | + message_id: int, |
| 107 | + guild_id: int, |
| 108 | + channel_id: int, |
| 109 | + title: str, |
| 110 | + description: str, |
| 111 | + colour: str, |
| 112 | + thumbnail: str, |
| 113 | + inline: bool, |
| 114 | + roles: List[dict] |
| 115 | + ): |
| 116 | + """ |
| 117 | + Edit a React For Role message |
| 118 | +
|
| 119 | + :param message_id: Message ID of RFR message |
| 120 | + :param guild_id: Guild ID of RFR message |
| 121 | + :param channel_id: Channel ID of RFR message |
| 122 | + :param title: Title of RFR message |
| 123 | + :param description: Description of RFR message |
| 124 | + :param colour: Hex colour code of RFR message |
| 125 | + :param thumbnail: thumbnail URL |
| 126 | + :param inline: fields should be inline |
| 127 | + :param roles: roles for RFR message |
| 128 | + :return: |
| 129 | + """ |
| 130 | + guild = self._bot.get_guild(guild_id) |
| 131 | + if roles is not None: |
| 132 | + roles = [ReactRole(r["emoji"], r["role_id"]).to_tuple(guild) for r in roles] |
| 133 | + return await core.update_rfr_message(bot=self._bot, |
| 134 | + message_id=message_id, |
| 135 | + guild_id=guild_id, |
| 136 | + channel_id=channel_id, |
| 137 | + title=title, |
| 138 | + description=description, |
| 139 | + colour=discord.Colour.from_str(colour), |
| 140 | + thumbnail=thumbnail, |
| 141 | + inline=inline, |
| 142 | + roles=roles) |
| 143 | + |
| 144 | + @parse_request |
| 145 | + async def patch_message(self, |
| 146 | + message_id: int, |
| 147 | + guild_id: int, |
| 148 | + channel_id: int, |
| 149 | + title: str = None, |
| 150 | + description: str = None, |
| 151 | + colour: str = None, |
| 152 | + thumbnail: str = None, |
| 153 | + inline: bool = None, |
| 154 | + roles: List[dict] = None |
| 155 | + ): |
| 156 | + """ |
| 157 | + Edit a React For Role message |
| 158 | +
|
| 159 | + :param message_id: Message ID of RFR message |
| 160 | + :param guild_id: Guild ID of RFR message |
| 161 | + :param channel_id: Channel ID of RFR message |
| 162 | + :param title: Title of RFR message |
| 163 | + :param description: Description of RFR message |
| 164 | + :param colour: Hex colour code of RFR message |
| 165 | + :param thumbnail: thumbnail URL |
| 166 | + :param inline: fields should be inline |
| 167 | + :param roles: roles for RFR message |
| 168 | + :return: |
| 169 | + """ |
| 170 | + guild = self._bot.get_guild(guild_id) |
| 171 | + if roles is not None: |
| 172 | + roles = [ReactRole(r["emoji"], r["role_id"]).to_tuple(guild) for r in roles] |
| 173 | + |
| 174 | + if colour is not None: |
| 175 | + colour = discord.Colour.from_str(colour) |
| 176 | + |
| 177 | + return await core.update_rfr_message(bot=self._bot, |
| 178 | + message_id=message_id, |
| 179 | + guild_id=guild_id, |
| 180 | + channel_id=channel_id, |
| 181 | + title=title, |
| 182 | + description=description, |
| 183 | + colour=colour, |
| 184 | + thumbnail=thumbnail, |
| 185 | + inline=inline, |
| 186 | + roles=roles) |
| 187 | + |
| 188 | + @parse_request |
| 189 | + async def delete_message(self, |
| 190 | + message_id: int, |
| 191 | + guild_id: int, |
| 192 | + channel_id: int |
| 193 | + ): |
| 194 | + """ |
| 195 | + Delete a React For Role message |
| 196 | +
|
| 197 | + :param message_id: Message ID of RFR message |
| 198 | + :param guild_id: Guild ID of RFR message |
| 199 | + :param channel_id: Channel ID of RFR message |
| 200 | + :return: |
| 201 | + """ |
| 202 | + await core.delete_rfr_message(self._bot, int(message_id), int(guild_id), int(channel_id)) |
| 203 | + return {"status": "DELETED", "message_id": message_id} |
| 204 | + |
| 205 | + @parse_request |
| 206 | + async def put_required_roles(self, |
| 207 | + guild_id: int, |
| 208 | + role_ids: List[int] = None |
| 209 | + ): |
| 210 | + """ |
| 211 | + Set or edit RFR required roles for a guild |
| 212 | +
|
| 213 | + :param guild_id: Guild ID of RFR message |
| 214 | + :param role_ids: List of required role IDs |
| 215 | + :return: |
| 216 | + """ |
| 217 | + core.edit_guild_rfr_required_roles(self._bot, guild_id, role_ids) |
| 218 | + return core.rfr_list_guild_required_roles(self._bot.get_guild(int(guild_id))) |
| 219 | + |
| 220 | + @parse_request |
| 221 | + async def get_required_roles(self, guild_id: int): |
| 222 | + """ |
| 223 | + Get RFR required roles for a guild |
| 224 | +
|
| 225 | + :param guild_id: Guild ID of RFR message |
| 226 | + :return: |
| 227 | + """ |
| 228 | + return core.rfr_list_guild_required_roles(self._bot.get_guild(int(guild_id))) |
| 229 | + |
| 230 | + |
| 231 | +def setup(bot: Bot): |
| 232 | + """ |
| 233 | + Load this cog to the KoalaBot. |
| 234 | + :param bot: the bot client for KoalaBot |
| 235 | + """ |
| 236 | + sub_app = web.Application() |
| 237 | + endpoint = RfrEndpoint(bot) |
| 238 | + endpoint.register(sub_app) |
| 239 | + getattr(bot, "koala_web_app").add_subapp('/{}'.format(RFR_ENDPOINT), sub_app) |
| 240 | + logger.info("RFR API is ready.") |
0 commit comments