Add FlanaDiscBot.restore_channel_names

This commit is contained in:
AlberLC
2023-11-07 08:58:12 +01:00
parent 4f5427093c
commit 688f5fee4e

View File

@@ -10,7 +10,7 @@ import discord
import flanautils import flanautils
import pytz import pytz
from flanautils import Media, NotFoundError, OrderedSet from flanautils import Media, NotFoundError, OrderedSet
from multibot import BadRoleError, DiscordBot, Platform, Role, User, bot_mentioned, constants as multibot_constants, group from multibot import BadRoleError, DiscordBot, Platform, Role, User, admin, bot_mentioned, constants as multibot_constants, group
from flanabot import constants from flanabot import constants
from flanabot.bots.flana_bot import FlanaBot from flanabot.bots.flana_bot import FlanaBot
@@ -23,6 +23,7 @@ from flanabot.models import Chat, Message, Punishment
class FlanaDiscBot(DiscordBot, FlanaBot): class FlanaDiscBot(DiscordBot, FlanaBot):
def __init__(self): def __init__(self):
super().__init__(os.environ['DISCORD_BOT_TOKEN']) super().__init__(os.environ['DISCORD_BOT_TOKEN'])
self.channels: dict[str, dict] = {}
self.heating = False self.heating = False
self.heat_level = 0.0 self.heat_level = 0.0
@@ -36,6 +37,7 @@ class FlanaDiscBot(DiscordBot, FlanaBot):
self.client.add_listener(self._on_voice_state_update, 'on_voice_state_update') self.client.add_listener(self._on_voice_state_update, 'on_voice_state_update')
self.register(self._on_audit_log, multibot_constants.KEYWORDS['audit']) self.register(self._on_audit_log, multibot_constants.KEYWORDS['audit'])
self.register(self._on_restore_channel_names, (multibot_constants.KEYWORDS['reset'], multibot_constants.KEYWORDS['chat']))
async def _changeable_roles(self, group_: int | str | Chat | Message) -> list[Role]: async def _changeable_roles(self, group_: int | str | Chat | Message) -> list[Role]:
group_id = self.get_group_id(group_) group_id = self.get_group_id(group_)
@@ -44,26 +46,25 @@ class FlanaDiscBot(DiscordBot, FlanaBot):
async def _heat_channel(self, channel: discord.VoiceChannel): async def _heat_channel(self, channel: discord.VoiceChannel):
async def set_fire_to(channel_key: str, depends_on: str, firewall=0): async def set_fire_to(channel_key: str, depends_on: str, firewall=0):
fire_score = random.randint(0, channels[depends_on]['n_fires'] - channels[channel_key]['n_fires']) - firewall // 2 fire_score = random.randint(0, self.channels[depends_on]['n_fires'] - self.channels[channel_key]['n_fires']) - firewall // 2
if fire_score < 1: if fire_score < 1:
if not channels[channel_key]['n_fires']: if not self.channels[channel_key]['n_fires']:
return return
channels[channel_key]['n_fires'] -= 1 self.channels[channel_key]['n_fires'] -= 1
elif fire_score == 1: elif fire_score == 1:
return return
else: else:
channels[channel_key]['n_fires'] += 1 self.channels[channel_key]['n_fires'] += 1
if channels[channel_key]['n_fires']: if self.channels[channel_key]['n_fires']:
new_name_ = '🔥' * channels[channel_key]['n_fires'] new_name_ = '🔥' * self.channels[channel_key]['n_fires']
else: else:
new_name_ = channels[channel_key]['original_name'] new_name_ = self.channels[channel_key]['original_name']
await channels[channel_key]['object'].edit(name=new_name_) await self.channels[channel_key]['object'].edit(name=new_name_)
channels = {}
for letter, channel_id in constants.DISCORD_HOT_CHANNEL_IDS.items(): for letter, channel_id in constants.DISCORD_HOT_CHANNEL_IDS.items():
channel_ = flanautils.find(channel.guild.voice_channels, condition=lambda c: c.id == channel_id) channel_ = flanautils.find(channel.guild.voice_channels, condition=lambda c: c.id == channel_id)
channels[letter] = { self.channels[letter] = {
'object': channel_, 'object': channel_,
'original_name': channel_.name, 'original_name': channel_.name,
'n_fires': 0 'n_fires': 0
@@ -87,7 +88,7 @@ class FlanaDiscBot(DiscordBot, FlanaBot):
i = int(self.heat_level) i = int(self.heat_level)
if not i: if not i:
n_fires = 0 n_fires = 0
new_name = channels['C']['original_name'] new_name = self.channels['C']['original_name']
elif i < len(constants.DISCORD_HEAT_NAMES): elif i < len(constants.DISCORD_HEAT_NAMES):
n_fires = 0 n_fires = 0
new_name = constants.DISCORD_HEAT_NAMES[i] new_name = constants.DISCORD_HEAT_NAMES[i]
@@ -95,14 +96,14 @@ class FlanaDiscBot(DiscordBot, FlanaBot):
n_fires = i - len(constants.DISCORD_HEAT_NAMES) + 1 n_fires = i - len(constants.DISCORD_HEAT_NAMES) + 1
n_fires = round(math.log(n_fires + 4, 1.2) - 8) n_fires = round(math.log(n_fires + 4, 1.2) - 8)
new_name = '🔥' * n_fires new_name = '🔥' * n_fires
channels['C']['n_fires'] = n_fires self.channels['C']['n_fires'] = n_fires
if channel.name != new_name: if channel.name != new_name:
await channel.edit(name=new_name) await channel.edit(name=new_name)
await set_fire_to('B', depends_on='C', firewall=len(channels['B']['object'].members)) await set_fire_to('B', depends_on='C', firewall=len(self.channels['B']['object'].members))
await set_fire_to('A', depends_on='B', firewall=len(channels['A']['object'].members)) await set_fire_to('A', depends_on='B', firewall=len(self.channels['A']['object'].members))
await set_fire_to('D', depends_on='C', firewall=len(channels['C']['object'].members)) await set_fire_to('D', depends_on='C', firewall=len(self.channels['C']['object'].members))
await set_fire_to('E', depends_on='D', firewall=len(channels['D']['object'].members)) await set_fire_to('E', depends_on='D', firewall=len(self.channels['D']['object'].members))
async def _punish(self, user: int | str | User, group_: int | str | Chat | Message, message: Message = None): async def _punish(self, user: int | str | User, group_: int | str | Chat | Message, message: Message = None):
user_id = self.get_user_id(user) user_id = self.get_user_id(user)
@@ -169,6 +170,12 @@ class FlanaDiscBot(DiscordBot, FlanaBot):
async def _on_member_remove(self, member: discord.Member): async def _on_member_remove(self, member: discord.Member):
(await self._create_user_from_discord_user(member)).save() (await self._create_user_from_discord_user(member)).save()
@group
@bot_mentioned
@admin(send_negative=True)
async def _on_restore_channel_names(self, _message: Message):
await self.restore_channel_names()
async def _on_voice_state_update(self, _: discord.Member, before: discord.VoiceState, after: discord.VoiceState): async def _on_voice_state_update(self, _: discord.Member, before: discord.VoiceState, after: discord.VoiceState):
if getattr(before.channel, 'id', None) == constants.DISCORD_HOT_CHANNEL_IDS['C']: if getattr(before.channel, 'id', None) == constants.DISCORD_HOT_CHANNEL_IDS['C']:
channel = before.channel channel = before.channel
@@ -195,3 +202,10 @@ class FlanaDiscBot(DiscordBot, FlanaBot):
'group_id': group_id, 'group_id': group_id,
'is_active': True 'is_active': True
})) }))
async def restore_channel_names(self):
for channel in self.channels.values():
original_name = channel['original_name']
channel = channel['object']
if channel.name != original_name:
await channel.edit(name=original_name)