Initial commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.env
|
||||||
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/../../../../../:\coding\python\och-bot\.idea/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
6
.idea/discord.xml
generated
Normal file
6
.idea/discord.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="DiscordProjectSettings">
|
||||||
|
<option name="show" value="PROJECT" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<settings>
|
||||||
|
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||||
|
<version value="1.0" />
|
||||||
|
</settings>
|
||||||
|
</component>
|
||||||
11
.idea/misc.xml
generated
Normal file
11
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="MavenImportPreferences">
|
||||||
|
<option name="generalSettings">
|
||||||
|
<MavenGeneralSettings>
|
||||||
|
<option name="mavenHome" value="C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\plugins\maven\lib\maven3" />
|
||||||
|
</MavenGeneralSettings>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8" project-jdk-type="Python SDK" />
|
||||||
|
</project>
|
||||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/och-bot.iml" filepath="$PROJECT_DIR$/.idea/och-bot.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
14
.idea/och-bot.iml
generated
Normal file
14
.idea/och-bot.iml
generated
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="PYTHON_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="jdk" jdkName="Python 3.8" jdkType="Python SDK" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
<component name="PackageRequirementsSettings">
|
||||||
|
<option name="requirementsPath" value="" />
|
||||||
|
</component>
|
||||||
|
<component name="PyDocumentationSettings">
|
||||||
|
<option name="renderExternalDocumentation" value="true" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
2
Dockerfile
Normal file
2
Dockerfile
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
FROM python:3
|
||||||
|
WORKDIR
|
||||||
153
bot.py
Normal file
153
bot.py
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
import asyncio
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import random
|
||||||
|
import re
|
||||||
|
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|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,
|
||||||
|
'prefix': 'och!'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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):
|
||||||
|
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:
|
||||||
|
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) as error:
|
||||||
|
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"
|
||||||
|
)
|
||||||
|
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')
|
||||||
|
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)
|
||||||
|
save_config()
|
||||||
|
await ctx.send('Config successfully updated')
|
||||||
|
except (ValueError, TypeError) as error:
|
||||||
|
await ctx.send('Invalid value "' + val + '" for config `' + key + '`')
|
||||||
|
|
||||||
|
|
||||||
|
bot.run(TOKEN)
|
||||||
1
config.json
Normal file
1
config.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"loeh-timeout": 15, "prefix": "och!"}
|
||||||
Reference in New Issue
Block a user