Andyssimo Bot

Nur Bullshit im Kopf

Andyssimo ist ein, mit Python programmierter Discord Bot. In diesem Artikel erkläre ich dir ausführlich wie du den Bot für deinen Server programmieren und gestalten kannst. Dazu liegt der ganze Quellcode für Andyssimo offen.

Um einen Discordbot erstellen zu können brauchst du erstmal einen Bot und ein Token zu dem Bot. Diese findest du auf https://discord.com/developers/applications. Du erstellst eine neue Applikation. Dann fügst du optional Beschreibung und Profilbild hinzu. Unter „Bot“ findest du deinen Token. Merke dir diesen! Du kannst jederzeit einen neuen erstellen. Die alten Token werden dabei ungültig.

Im nächsten Schritt installierst du Python3. Entweder von der Offiziellen Webseite oder im Microsoft Store.

Damit der Code auch funktioniert müssen ersteinmal ein paar Abhängigkeiten installiert werden. Dies kann man mit dem integrierten pip Installer machen.

pip3 install asyncio
pip3 install discord
pip3 install openai
pip3 install requests
pip3 install ffmpeg
pip3 install pydub
pip3 install schedule

Wenn alle Abhängigkeiten installiert sind kann der Code ausgeführt werden. Dazu kannst du den folgenden Code einfach in eine Python-Datei einfügen. Die Python-Datei endet mit „.py„.

import asyncio
import discord
from discord.ext import commands
from discord.ext.tasks import loop
import openai
import urllib.request
import time
from datetime import datetime
import requests
import random
import json
import ffmpeg
from pydub import AudioSegment
from pydub.playback import play
import os
os.environ["PATH"] += os.pathsep + '/usr/bin/ffmpeg'
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
import schedule
from discord import Embed
# Set intents
intents = discord.Intents.default()
intents.members = True
intents = discord.Intents.all()
# Create the bot
client = discord.Client(intents=intents)
bot = commands.Bot(command_prefix='!', intents=intents)
# Set the API key für OpenAI API
api_key = "HIER_DEIN_OPENAI_API_KEY_EINFÜGEN"
# Define a command that uses the OpenAI API to access the chat system
@bot.command()
async def c(ctx, *, message: str):
user_id = ctx.author.id
if user_id == 0:
return await ctx.message.reply("Nein, du nicht :)")
else:
response = openai.Completion.create(
engine="text-davinci-003",
prompt=message,
max_tokens=2000,
api_key=api_key
)
await ctx.message.reply(response['choices'][0]['text'])
@bot.command()
async def c1(ctx, *, message: str):
user_id = ctx.author.id
if user_id == 0:
return await ctx.message.reply("Nein, du nicht :)")
else:
response = openai.Completion.create(
engine="text-davinci-002",
prompt=message,
max_tokens=2000,
api_key=api_key
)
await ctx.message.reply(response['choices'][0]['text'])
@bot.command()
async def c2(ctx, *, message: str):
user_id = ctx.author.id
if user_id == 0:
return await ctx.message.reply("Nein, du nicht :)")
else:
response = openai.Completion.create(
engine="text-davinci-001",
prompt=message,
max_tokens=2000,
api_key=api_key
)
await ctx.message.reply(response['choices'][0]['text'])
# Bot spielt bei !play einen der Radio Sender.
@bot.command(name='play')
async def play(ctx):
channel = ctx.author.voice
if channel is None:
await ctx.send("You are not in a voice channel.")
return
stations = {
"🍪": "http://tuner.m1.fm/clubmix.mp3",
"🍕": "http://tuner.m1.fm/90er.mp3",
"🍍": "https://stream01.iloveradio.de/iloveradio6.mp3",
"🥞": "http://server.webnetradio.net/proxy/magicfla?mp=/1"
}
embed = discord.Embed(title="Musikbot", description="Wähle einen Sender!", color=0xA822F6)
embed.add_field(name="🍪", value="ClubMix",inline=False)
embed.add_field(name="🍕", value="90erFM",inline=False)
embed.add_field(name="🍍", value="DeutschRap",inline=False)
embed.add_field(name="🥞", value="Magic Oldies Florida",inline=False)
message = await ctx.send(embed=embed)
for station in stations.keys():
await message.add_reaction(station)
def check(reaction, user):
return user == ctx.author and str(reaction.emoji) in stations.keys()
try:
reaction, user = await bot.wait_for('reaction_add', timeout=60.0, check=check)
except asyncio.TimeoutError:
await ctx.send("You did not select a station in time.")
return
url = stations[str(reaction.emoji)]
vc = await channel.channel.connect()
vc.play(discord.FFmpegPCMAudio(url))
# Schmeißt den Bot aus dem Channel
@bot.command(name='stop')
async def stop(ctx):
vc = ctx.voice_client
await vc.disconnect()
#mit !img wird ein Bild aus deinen Worten erstellt
@bot.command()
async def img(ctx, *, prompt):
response = openai.Image.create(prompt=prompt, model="image-alpha-001", api_key=api_key)
url = response["data"][0]["url"]
# Download the image to a local file
urllib.request.urlretrieve(url, "image.png")
# Send the local file
await ctx.message.reply(file=discord.File("image.png"))
#mit !h wird eine Übersicht aller Befehle in den Chat gesendet 
@bot.command()
async def h(ctx):
"""This is a custom command"""
embed = discord.Embed(title="Usage of Andybot", description="Behfelsübersicht Andybot", color=0xA822F6)
embed.add_field(name="!c", value="This command is for chatting with the Bot",inline=False)
embed.add_field(name="!c1", value="Dieser Befehl ist die 'dumme' Version des !c Befehls.(Viele Fehler, keine Antwort möglich)",inline=False)
embed.add_field(name="!c2", value="Dieser Befehl ist der Vorganger des !c Befehls. Er funktionier, ist aber nicht so Intelligent.",inline=False)
embed.add_field(name="!img", value="This command generates pictures with words",inline=False)
embed.add_field(name="!meme", value="Zeigt dir ein zufälliges Meme an.",inline=False)
embed.add_field(name="!MiniWinnie", value="Unsere Herscherin und Tyrannin, nutze den Befehl mit Bedacht!",inline=False)
embed.add_field(name="!beichte (Nur DM)", value="Schreibe dem Bot eine DM mit dem Behfel **!beichte** und die Beichte erscheint im Beichtenchannel",inline=False)
embed.set_thumbnail(url="https://www.udrop.com/file/7KgJ/thumnail_andybot_embet.png")
await ctx.message.reply(embed=embed)
#mit dem Befehl !beichte an den DMCHat des Bot wird in einem definierten Channel eine Nachricht mit der Beichte geschickt.
@bot.command()
async def beichte(ctx, *, message: str = None):
if message is None:
await ctx.send("Bitte benutze den Befehl mit einem Text. Eine leere Eingabe ist nicht zulässig!")
return
if isinstance(ctx.channel, discord.DMChannel):
channel_id = 0000000000000000 #mit ihrer ID ersetzen
channel = bot.get_channel(channel_id)
embed = discord.Embed(title="Deine Beichte",
color=0xA822F6,
timestamp=datetime.utcnow())
embed.add_field(name="", value=f"{message}",inline=False)
embed.add_field(name="Beichte einsenden", value="Du willst auch eine Beichte einsenden?\n Schreib dem Bot eine DM mit dem Befehl **!beichte** und die beichte erscheint hier!")
embed.set_thumbnail(url="https://www.udrop.com/file/7KgJ/thumnail_andybot_embet.png")
await channel.send(embed=embed)
else:
await ctx.send("Bitte sende den Befehl nur im Bot DM Channel!")
#mit !meme werden zufällige Memes geschickt
@bot.command()
async def meme(ctx):
# Get a list of popular memes
memes_list = requests.get("https://api.imgflip.com/get_memes").json()["data"]["memes"]
# select only memes that have text fields
text_memes = [meme for meme in memes_list if meme["box_count"]>0]
# Select a random meme from the list
selected_meme = random.choice(text_memes)
# Get the url of the selected meme
selected_meme_url = selected_meme["url"]
# Send the selected meme as a reply to the message
await ctx.message.reply(selected_meme_url)
#mit !an an den DMCHat des Bots wird eine Nachricht in den Ankündigungschat des Channels geschickt.
authorized_users = [00000000000, 000000000000] # hier ID der Autorisierten nutzer eingeben.
@bot.command()
async def an(ctx, *, message):
if ctx.author.id in authorized_users:
if isinstance(ctx.channel, discord.DMChannel):
target_channel = bot.get_channel(Hier channel eingeben)
embed = discord.Embed(title="Andkündigung und Information", description=message, color=discord.Color.magenta())
embed.timestamp = ctx.message.created_at
embed.set_thumbnail(url="https://www.udrop.com/file/7KOF/important.png")
await target_channel.send(embed=embed)
else:
await ctx.send("Du hast keine Berechtigung diesen Befehl zu nutzen!")
conversation_history = {}
@bot.event
async def on_message(message):
await bot.process_commands(message)
if message.channel.id == 000000000000:
if message.author.id != 000000000000:
await message.delete()
if message.content.lower() == "save":
await message.reply("safe*")
if message.guild:
member = message.guild.get_member(message.author.id)
if member:
role = discord.utils.get(member.roles, id=000000000000)
if role:
if message.content.isupper() and len(message.content) > 3:
await message.channel.send("Schrei nicht so rum, digga!")
conversation_history = {}
if message.channel.id == 00000000000 and message.author != bot.user:
user_id = message.author.id
if user_id in conversation_history:
prompt = f"language:de chatbot-name:Andyssimo, author:Andy, {conversation_history[user_id]} {message.content}"
else:
prompt = f"language:de, chatbot-name:Andyssimo, author:Andy, {message.content}"
openai.api_key = "OPENAI_API_KEY"
response = openai.Completion.create(
engine="text-davinci-003",
prompt=prompt,
temperature=1,
max_tokens=500,
top_p=1,
frequency_penalty=0.3,
presence_penalty=0.1,
stop=["bye"],
)
conversation_history[user_id] = message.content
if response["choices"][0]["text"]:
await message.channel.send(response["choices"][0]["text"])
@bot.event
async def on_ready():
# Set the Rich Presence activity
activity = discord.Activity(
name="Celines Windaudios",
type=discord.ActivityType.listening
)
await bot.change_presence(activity=activity)
print(f'{bot.user} has connected to Discord!')
channel = bot.get_channel(00000000000)
embed = Embed(title="Andyssimo - Reaction roles", description="Reagiere mit dem entsprechendem Emoji um die Rolle zu bekommen", color=0xA822F6)
embed.add_field(name="Caps", value="> 🆙   Du erhälst eine Warnung wenn du übermäßg Caps benutzt",inline=False)
embed.add_field(name="News", value="> 📰   Du bekommst Nachrichten aus dem News-Channel" ,inline=False)
embed.add_field(name="Quotes", value="> 💬   Du bekommst jeden Tag einen Quote im Quote-Channel" ,inline=False)
message = await channel.send(embed=embed)
await message.add_reaction("🆙")
await message.add_reaction("📰")
await message.add_reaction("💬")
@bot.event
async def on_raw_reaction_add(payload):
if payload.user_id == bot.user.id:
return
channel = bot.get_channel(payload.channel_id)
message = await channel.fetch_message(payload.message_id)
member = discord.utils.find(lambda m: m.id == payload.user_id, message.guild.members)
role = discord.utils.get(message.guild.roles, name='caps')
if str(payload.emoji) == '🆙':
if role in member.roles:
await member.remove_roles(role)
else:
await member.add_roles(role)
role = discord.utils.get(message.guild.roles, name='News')
if str(payload.emoji) == '📰':
if role in member.roles:
await member.remove_roles(role)
else:
await member.add_roles(role)
role = discord.utils.get(message.guild.roles, name='quotes')
if str(payload.emoji) == '💬':
if role in member.roles:
await member.remove_roles(role)
else:
await member.add_roles(role)
# Run the bot
bot.run('BOT_TOKEN')

Für den Code ersetzt du alle Channe- und Author IDS durch deine eigenen. Nicht benötigte Features können einfach aus dem Code rausgenommen werden ohne Auswirkung auf die Gesamtfunktion des Bots. Ich werden hier nicht den Gesamten code des Bots erklären. Falls du doch fragen hast, kannst du mich über den Kontakt Knopf erreichen. Wenn du Verbesserungsvorschläge hast, dann kannst du Sie mir gerne mitteilen.


Codeabschnitte für die einzel Benutzung

Dieser Code erstellt den !c Befehl. Beim Ausführen des Befehl mit einer anschließenden Frage, wird die Frage an die OpenAI API geschickt. Dort wird die Frage bearbeitet und eine Antwort in den Channel in dem der Befehl ausgeführt ist, gesendet. Wichtig ist, dass du deinen OpenAi API_Key einfügst. Diesen findest du auf der OpenAi Webseite. Parameter die du anpassen kannst:

  • Engine: Du hast die Möglichkeit verschiedene Engines zu verwenden. Die aktuellste ist text-davinci-003. Der Vorgänger ist text-davinci-002. Weitere Engines befinden sich auf der OpenAi Webseite.
  • max_tokens: hier kannst du bestimmen wie lang die Antworten maximal sein dürfen. Bei 4000 Tokens ist die API abgeriegelt.

Wichtig zu beachten ist, dass die API für maximal 3 Monate oder bis zu einer Summe von 18$ freigegeben ist. Danach muss bezahlt werden. Die Preise findet ihr auf der OpenAI Webseite.

# Set the API key für OpenAI API
api_key = "HIER_DEIN_OPENAI_API_KEY_EINFÜGEN"
# Define a command that uses the OpenAI API to access the chat system
@bot.command()
async def c(ctx, *, message: str):
user_id = ctx.author.id
if user_id == 0:
return await ctx.message.reply("Nein, du nicht :)")
else:
response = openai.Completion.create(
engine="text-davinci-003",
prompt=message,
max_tokens=2000,
api_key=api_key
)
await ctx.message.reply(response['choices'][0]['text'])


Der Artikel ist noch nicht vollständig und wird in naher Zukunft ergänzt.