Files
och-bot/bot.py
2020-12-08 11:51:19 +01:00

169 lines
5.5 KiB
Python

import asyncio
import json
import os
import random
import re
import time
from typing import Optional
import discord
from discord.ext import commands
from dotenv import load_dotenv
load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
CONFIG = 'config.json'
PING_REGEX = re.compile(r'\b(?:ge)?ping', re.IGNORECASE)
TOPFIT_REGEX = re.compile(r'\b(topfit|fit|top|micro|microsoft|virtual reality|vr|ä+h*m*|hä*)\b', re.IGNORECASE)
LOEH_REGEX = re.compile(r'Och L(?:oe|ö)h!?', re.IGNORECASE)
TOPFIT_WORDS = (
"äh",
"ähm",
"ääh",
"äääh",
"ä",
"..",
"...",
"Mi",
"Mic",
"Micro",
"Microsoft",
"Microservices",
"top",
"vortual reality"
)
# LOEH_ID = 327126546970312739
LOEH_ID = 254265844928872448
SIP_ID = 327126546970312739
config: dict = {
'loeh-timeout': 10,
'loeh-cooldown': 20,
'prefix': 'och!'
}
last_loeh = 0
def load_config() -> dict:
try:
config_file = open(CONFIG, 'r')
config.update(json.load(config_file))
except (json.JSONDecodeError, FileNotFoundError):
pass
return config
def save_config():
with open(CONFIG, 'w') as config_file:
json.dump(config, config_file)
load_config()
bot = commands.Bot(command_prefix=config.get('prefix'))
async def get_loeh(guild: discord.Guild) -> Optional[discord.Member]:
try:
return await guild.fetch_member(LOEH_ID)
except discord.NotFound:
return None
@bot.event
async def on_ready():
print(f'{bot.user} has connected to Discord!')
@bot.event
async def on_message(message: discord.Message):
global last_loeh, config
if not message.author.bot:
if LOEH_REGEX.match(message.content):
if message.author.id == LOEH_ID:
await message.channel.send("https://siphalor.de/img/spidy-is-that-you.jpg")
else:
t = time.time()
if t - config['loeh-cooldown'] <= last_loeh:
await message.channel.send('Don\'t try this to often, **' + message.author.nick +
'**. That might backfire.')
last_loeh = t
return
last_loeh = t
loeh = await get_loeh(message.guild)
if loeh is None:
await message.channel.send('404: Löh not found!')
else:
try:
await loeh.edit(mute=True)
sleeper = asyncio.sleep(config.get('loeh-timeout'))
message: Optional[discord.Message] = await message.channel.send('Zu Befehl!')
await sleeper
await loeh.edit(mute=False)
if message is not None:
await message.edit(content="~~Zu Befehl!~~\nEs sei ihm verziehen.")
except (discord.Forbidden, discord.HTTPException):
await message.channel.send('Failed to complete your command, Sir')
return
elif PING_REGEX.search(message.content):
embed = discord.Embed(
title="*pinken, schwaches Verb*",
description="ein Netzwerkgerät testweise ansprechen.\nOft falsch geschrieben als pin__g__en",
color=16636435
)
embed.add_field(name='ich', value='pinke')
embed.add_field(name='du', value='pinkst')
embed.add_field(name='er|sie|es', value='pinkt')
embed.add_field(name='wir', value='pinken')
embed.add_field(name='ihr', value='pinkt')
embed.add_field(name='sie', value='pinken')
embed.add_field(name='Partizip 2', value='gepinkt')
await message.channel.send(embed=embed)
else:
match = TOPFIT_REGEX.search(message.content)
if match is not None:
text = ''
for i in range(0, random.randint(7, 13)):
text += random.choice(TOPFIT_WORDS) + " "
text += match.group()
await message.channel.send(text)
await bot.process_commands(message)
@bot.command(name='config')
async def config_prefix_command(ctx: commands.Context, cmd: str = '', key: str = '', *, val: str = ''):
if ctx.author.id != SIP_ID:
await ctx.send('You\'re not allowed to touch my most valuable piece')
return
if cmd == '':
await ctx.send('Use `config get` or `config set` to query for or update config values. Use `config list` to '
'see all config options')
elif cmd == 'list':
await ctx.send('Available config options:\n'
' - `prefix`: Set the bot prefix\n'
' - `loeh-timeout`: The timeout for Löh in seconds'
' - `loeh-cooldown`: Number of seconds between timeouts')
elif cmd == 'get':
if key in config:
await ctx.send('`' + key + '` is set to ' + str(config.get(key)))
else:
await ctx.send('Unknown config option "' + key + '"')
elif cmd == 'set':
try:
if key == 'prefix':
config['prefix'] = val
elif key == 'loeh-timeout':
config['loeh-timeout'] = int(val)
elif key == 'loeh-cooldown':
config['loeh-cooldown'] = int(val)
save_config()
await ctx.send('Config successfully updated')
except (ValueError, TypeError):
await ctx.send('Invalid value "' + val + '" for config `' + key + '`')
bot.run(TOKEN)