@@ -182,13 +182,20 @@ async def daily_task(bot: Bot) -> bool:
182
182
183
183
184
184
@tasks .loop (minutes = 1.0 )
185
- async def role_update_task (bot : Bot ) -> bool :
185
+ async def role_update_task (bot : Bot , test_mode : bool = False ) -> bool :
186
186
"""
187
187
Run the role update task.
188
188
189
189
This function runs on a schedule, every 1 minute.
190
190
If the current time is not divisible by 10, return False. e.g. Run every 10 minutes.
191
191
192
+ Parameters
193
+ ----------
194
+ bot : Bot
195
+ The Discord bot instance.
196
+ test_mode : bool, optional
197
+ Whether to run the task in test mode, by default False. This simply affects how the roles are assigned.
198
+
192
199
Returns
193
200
-------
194
201
bool
@@ -234,14 +241,14 @@ async def role_update_task(bot: Bot) -> bool:
234
241
user_data ['roles' ] = []
235
242
236
243
if user_data .get ('github_username' ):
237
- user_data ['roles' ].append ('github-users ' )
244
+ user_data ['roles' ].append ('github-user ' )
238
245
239
246
# update the discord user roles
240
247
for g in bot .guilds :
241
248
roles = g .roles
242
249
243
250
role_map = {
244
- 'github-users ' : discord .utils .get (roles , name = 'github-users ' ),
251
+ 'github-user ' : discord .utils .get (roles , name = 'github-user ' ),
245
252
'supporters' : discord .utils .get (roles , name = 'supporters' ),
246
253
't1-sponsors' : discord .utils .get (roles , name = 't1-sponsors' ),
247
254
't2-sponsors' : discord .utils .get (roles , name = 't2-sponsors' ),
@@ -258,13 +265,21 @@ async def role_update_task(bot: Bot) -> bool:
258
265
continue
259
266
260
267
if user_role in user_roles :
261
- # await member.add_roles(role)
262
- add_future = asyncio .run_coroutine_threadsafe (member .add_roles (role ), bot .loop )
263
- add_future .result ()
268
+ if not test_mode :
269
+ await member .add_roles (role )
270
+ else :
271
+ # using a standard await fails inside unit tests, although it works normally
272
+ # RuntimeError: Timeout context manager should be used inside a task
273
+ add_future = asyncio .run_coroutine_threadsafe (member .add_roles (role ), bot .loop )
274
+ add_future .result ()
264
275
elif user_role in revocable_roles :
265
- # await member.remove_roles(role)
266
- remove_future = asyncio .run_coroutine_threadsafe (member .remove_roles (role ), bot .loop )
267
- remove_future .result ()
276
+ if not test_mode :
277
+ await member .remove_roles (role )
278
+ else :
279
+ # using a standard await fails inside unit tests, although it works normally
280
+ # RuntimeError: Timeout context manager should be used inside a task
281
+ remove_future = asyncio .run_coroutine_threadsafe (member .remove_roles (role ), bot .loop )
282
+ remove_future .result ()
268
283
269
284
with bot .db as db :
270
285
db ['discord_users' ] = discord_users
0 commit comments