mirror of
				https://github.com/osmarks/autobotrobot
				synced 2025-10-31 07:53:00 +00:00 
			
		
		
		
	fix concurrency issue by serializing role transfers
This commit is contained in:
		| @@ -2,22 +2,28 @@ import util | ||||
| import random | ||||
| import logging | ||||
| import discord | ||||
| import asyncio | ||||
|  | ||||
| import metrics | ||||
|  | ||||
| role_transfer_lock = asyncio.Lock() | ||||
|  | ||||
| def setup(bot): | ||||
| 	@bot.listen() | ||||
| 	async def on_message(message): | ||||
| 		if message.guild.id == util.config["esoserver"]["id"]: | ||||
| 			for role in message.role_mentions: | ||||
| 				if role.id == util.config["esoserver"]["transfer_role"]: # transfer the role from sender to other pinged person | ||||
| 					if len(message.mentions) == 1: | ||||
| 						await message.author.remove_roles(role, reason="untransfer unrole") | ||||
| 						await message.mentions[0].add_roles(role, reason="transfer role") | ||||
| 					return | ||||
| 			for user in message.mentions: | ||||
| 				for role in user.roles: | ||||
| 					if role.id == util.config["esoserver"]["transfer_role"]: # transfer from pingee to pinger | ||||
| 						await user.remove_roles(role, reason="untransfer unrole") | ||||
| 						await message.author.add_roles(role, reason="transfer role") | ||||
| 						return | ||||
| 			async with role_transfer_lock: # prevent concurrency horrors - serialize accesses, probably | ||||
| 				for role in message.role_mentions: | ||||
| 					if role.id == util.config["esoserver"]["transfer_role"]: # transfer the role from sender to other pinged person | ||||
| 						if len(message.mentions) == 1: | ||||
| 							await message.author.remove_roles(role, reason="untransfer unrole") | ||||
| 							await message.mentions[0].add_roles(role, reason="transfer role") | ||||
| 							metrics.role_transfers.inc() | ||||
| 						return | ||||
| 				for user in message.mentions: | ||||
| 					for role in user.roles: | ||||
| 						if role.id == util.config["esoserver"]["transfer_role"]: # transfer from pingee to pinger | ||||
| 							await user.remove_roles(role, reason="untransfer unrole") | ||||
| 							await message.author.add_roles(role, reason="transfer role") | ||||
| 							metrics.role_transfers.inc() | ||||
| 							return | ||||
| @@ -2,3 +2,4 @@ import prometheus_client | ||||
|  | ||||
| achievements_achieved = prometheus_client.Counter("abr_achievements", "Achievements achieved by users") | ||||
| reminders_fired = prometheus_client.Counter("abr_reminders", "Reminders successfully delivered to users") | ||||
| role_transfers = prometheus_client.Counter("abr_role_transfers", "Times the esoserver transferable role has been transferred") | ||||
		Reference in New Issue
	
	Block a user