Skip to content

Commit 44492c8

Browse files
authored
Merge pull request #313 from KoalaBotUK/feat/rfr-api-cog
ReactForRole API
2 parents 6e4eec3 + c8d4a8b commit 44492c8

File tree

13 files changed

+1414
-634
lines changed

13 files changed

+1414
-634
lines changed
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,7 @@
1-
from . import utils, db, models
2-
from .cog import ReactForRole, setup
1+
from . import utils, db, models, cog, core, api
2+
from .cog import ReactForRole
3+
4+
5+
async def setup(bot):
6+
await cog.setup(bot)
7+
api.setup(bot)

koala/cogs/react_for_role/api.py

Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
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

Comments
 (0)