dragon-bot/app/bot.py
Luke R 95fe9bbb87
All checks were successful
continuous-integration/drone/push Build is passing
Adding in the first pass at llm
2024-04-05 23:16:56 -07:00

200 lines
5.7 KiB
Python
Executable File

#!/usr/local/bin/python
from discord.ext import commands
import discord
import os
import requests
import requests_cache
intents = discord.Intents.default()
intents.message_content = True
intents.members = True
intents.reactions = True
bot = commands.Bot(command_prefix="!", intents=intents)
cogfiles = [
f"cogs.{filename[:-3]}"
for filename in os.listdir("/app/cogs/")
if filename.endswith(".py")
]
for cogfile in cogfiles:
bot.load_extension(cogfile)
requests_cache.install_cache(expire_after=300)
@bot.event
async def on_ready():
print(f"{bot.user.name} has connected to Discord!")
# for server in bot.guilds:
# if server.name in [
# # "no officer it's hi how r u",
# "Aeturnum",
# "Naked Knights",
# "MadsenHouse",
# "Safety Zone",
# "R3 Server",
# "Thieve's Den MC",
# "Thieve's Den",
# ]:
# await server.leave()
# print("Left %s" % server.name)
if os.getenv("DRAGON_ENV") == "prod":
# await bot.get_channel(152921472304676865).send("I have reconnected")
# Waiting-room in zoid's server
channel_id = 1026281775984549958
message_id = 1099374735428681758
# for testing, bot-testing server's channel
# channel_id = 932476007439552522
# message_id = 1114045480129806361
blurb = """# Please react to this message with one of the following emojis to be granted the appropriate role(s):
🚀 for Star Citizen
<:helldivers:1205747460287504424> for HellDivers
<:palsphere:1201663585596481586> for Palworld
🐀 for Darktide/Vermintide
:gear: for Lethal Company
🤖 for Warframe
🚔 for Ready or Not/Ground Branch
🔫 for Tarkov
"""
# message = await bot.get_channel(channel_id).send(blurb)
# Update the message on_ready to match the content we always want to be there
message = await bot.get_channel(channel_id).fetch_message(message_id)
await message.edit(content=blurb)
@bot.event
async def on_raw_reaction_add(payload):
guild = bot.get_guild(payload.guild_id)
role_map = {
"🔫": "Tarkov Gamers",
"🤖": "Warframe Enjoyers",
"🐀": "Dorktide Gamers",
"helldivers": "Hell Divers",
"🚀": "Star Citizens",
"⚙️": "Lethal Gamers",
"🚔": "Ready or Notters",
"palsphere": "Palworlders",
}
if payload.channel_id == 1026281775984549958:
role = discord.utils.get(guild.roles, name=role_map[payload.emoji.name])
member = guild.get_member(payload.user_id)
await member.add_roles(role)
@bot.listen("on_message")
async def convert_heic_to_jpg(ctx):
from cmagick import cmagick
import time
import tempfile
if ctx.attachments:
for attachment in ctx.attachments:
if attachment.filename.lower().endswith(("heic", "tiff")):
source_file = "/tmp/source"
source_file, file_path = tempfile.mkstemp()
jpg_file = "/tmp/%s.jpg" % time.time()
await attachment.save(fp=file_path)
cmagick.convert(file_path, jpg_file)
try:
await ctx.delete()
except Exception:
pass
await ctx.channel.send(
"%s said:\n%s" % (ctx.author.mention, ctx.content),
file=discord.File(jpg_file),
)
os.remove(file_path)
return
@bot.listen("on_message")
async def fix_social_media_links(ctx):
correct_domains = {
"https://x.com": "vxtwitter",
"https://www.x.com": "vxtwitter",
"https://twitter.com": "vxtwitter",
"https://www.twitter.com": "vxtwitter",
"https://tiktok.com": "vxtiktok",
"https://www.tiktok.com": "vxtiktok",
}
if ctx.author.id == bot.user.id:
return
for k in correct_domains.keys():
if ctx.content.startswith(k) or ctx.content.startswith("www.{k}.com"):
await ctx.channel.send(
"%s said:\n%s"
% (
ctx.author.mention,
ctx.content.replace(k, "https://%s.com" % correct_domains[k]).split(
"?"
)[0],
)
)
await ctx.delete()
return
@bot.event
async def on_message(ctx):
if str(bot.user.id) in ctx.content:
url = "http://192.168.1.52:1337/v1/chat/completions"
bot_prompt = (
"You are a helpful assistant. You will answer questions conciesely"
"and as detailed as possible. You are based out of the United states in California."
)
payload = {
"messages": [
{
"content": bot_prompt,
"role": "system",
},
{
"content": ctx.content.replace(str(bot.user.id), "").replace(
"<@> ", ""
),
"role": "user",
},
],
"model": "openchat-3.5-7b",
"stream": False,
"max_tokens": 4096,
"stop": ["hello"],
"frequency_penalty": 0,
"presence_penalty": 0,
"temperature": 0.7,
"top_p": 0.95,
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
await ctx.reply(
response.json()["choices"][0]["message"]["content"].replace(
"<|end_of_turn|>", ""
)
)
bot.run(os.getenv("discord_token"))