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 random | ||||||
| import logging | import logging | ||||||
| import discord | import discord | ||||||
|  | import asyncio | ||||||
|  |  | ||||||
| import metrics | import metrics | ||||||
|  |  | ||||||
|  | role_transfer_lock = asyncio.Lock() | ||||||
|  |  | ||||||
| def setup(bot): | def setup(bot): | ||||||
| 	@bot.listen() | 	@bot.listen() | ||||||
| 	async def on_message(message): | 	async def on_message(message): | ||||||
| 		if message.guild.id == util.config["esoserver"]["id"]: | 		if message.guild.id == util.config["esoserver"]["id"]: | ||||||
| 			for role in message.role_mentions: | 			async with role_transfer_lock: # prevent concurrency horrors - serialize accesses, probably | ||||||
| 				if role.id == util.config["esoserver"]["transfer_role"]: # transfer the role from sender to other pinged person | 				for role in message.role_mentions: | ||||||
| 					if len(message.mentions) == 1: | 					if role.id == util.config["esoserver"]["transfer_role"]: # transfer the role from sender to other pinged person | ||||||
| 						await message.author.remove_roles(role, reason="untransfer unrole") | 						if len(message.mentions) == 1: | ||||||
| 						await message.mentions[0].add_roles(role, reason="transfer role") | 							await message.author.remove_roles(role, reason="untransfer unrole") | ||||||
| 					return | 							await message.mentions[0].add_roles(role, reason="transfer role") | ||||||
| 			for user in message.mentions: | 							metrics.role_transfers.inc() | ||||||
| 				for role in user.roles: | 						return | ||||||
| 					if role.id == util.config["esoserver"]["transfer_role"]: # transfer from pingee to pinger | 				for user in message.mentions: | ||||||
| 						await user.remove_roles(role, reason="untransfer unrole") | 					for role in user.roles: | ||||||
| 						await message.author.add_roles(role, reason="transfer role") | 						if role.id == util.config["esoserver"]["transfer_role"]: # transfer from pingee to pinger | ||||||
| 						return | 							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") | achievements_achieved = prometheus_client.Counter("abr_achievements", "Achievements achieved by users") | ||||||
| reminders_fired = prometheus_client.Counter("abr_reminders", "Reminders successfully delivered to 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