mirror of
https://github.com/osmarks/autobotrobot
synced 2025-05-05 08:54:14 +00:00
Refactor, autogollark
This commit is contained in:
parent
d64e7895f0
commit
586c921e8b
@ -22,6 +22,7 @@ achievements = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async def achieve(bot: commands.Bot, message: discord.Message, achievement):
|
async def achieve(bot: commands.Bot, message: discord.Message, achievement):
|
||||||
|
guild_conf = None
|
||||||
if message.guild:
|
if message.guild:
|
||||||
guild_conf = await bot.database.execute_fetchone("SELECT achievement_messages FROM guild_config WHERE id = ?", (message.guild.id,))
|
guild_conf = await bot.database.execute_fetchone("SELECT achievement_messages FROM guild_config WHERE id = ?", (message.guild.id,))
|
||||||
if guild_conf and guild_conf["achievement_messages"] == 0: return
|
if guild_conf and guild_conf["achievement_messages"] == 0: return
|
||||||
|
@ -195,52 +195,5 @@ AutoBotRobot is operated by gollark/osmarks.
|
|||||||
|
|
||||||
await ctx.send("\n".join(map(lambda x: f"{x[0]} x{x[1]}", results)))
|
await ctx.send("\n".join(map(lambda x: f"{x[0]} x{x[1]}", results)))
|
||||||
|
|
||||||
@commands.command(help="Highly advanced AI Assistant.")
|
|
||||||
async def ai(self, ctx, *, query=None):
|
|
||||||
prompt = []
|
|
||||||
seen = set()
|
|
||||||
|
|
||||||
def render(dt: datetime):
|
|
||||||
return f"{dt.hour:02}:{dt.minute:02}"
|
|
||||||
|
|
||||||
async for message in ctx.channel.history(limit=20):
|
|
||||||
display_name = message.author.display_name
|
|
||||||
if message.author == self.bot.user:
|
|
||||||
display_name = util.config["ai"]["own_name"]
|
|
||||||
content = message.content
|
|
||||||
if content.startswith(ctx.prefix + "ai"):
|
|
||||||
content = content.removeprefix(ctx.prefix + "ai").lstrip()
|
|
||||||
if not content and message.embeds:
|
|
||||||
content = message.embeds[0].title
|
|
||||||
elif not content and message.attachments:
|
|
||||||
content = "[attachments]"
|
|
||||||
if not content:
|
|
||||||
continue
|
|
||||||
if message.author == self.bot.user:
|
|
||||||
if content in seen: continue
|
|
||||||
seen.add(content)
|
|
||||||
prompt.append(f"[{render(message.created_at)}] {display_name}: {content}\n")
|
|
||||||
if sum(len(x) for x in prompt) > util.config["ai"]["max_len"]:
|
|
||||||
break
|
|
||||||
prompt.reverse()
|
|
||||||
prompt.append(f'[{render(datetime.utcnow())}] {util.config["ai"]["own_name"]}:')
|
|
||||||
generation = await util.generate(self.session, util.config["ai"]["prompt_start"] + "".join(prompt))
|
|
||||||
if generation.strip(): await ctx.send(generation.strip())
|
|
||||||
|
|
||||||
@commands.command(help="Search meme library.", aliases=["memes"])
|
|
||||||
async def meme(self, ctx, *, query=None):
|
|
||||||
search_many = ctx.invoked_with == "memes"
|
|
||||||
raw_memes = await util.user_config_lookup(ctx, "enable_raw_memes") == "true"
|
|
||||||
async with self.session.post(util.config["memetics"]["meme_search_backend"], json={
|
|
||||||
"terms": [{"text": query, "weight": 1}],
|
|
||||||
"k": 4 if search_many else 1
|
|
||||||
}) as res:
|
|
||||||
results = await res.json()
|
|
||||||
if raw_memes:
|
|
||||||
o_files = [ discord.File(Path(util.config["memetics"]["memes_local"]) / Path(util.config["memetics"]["meme_base"]) / m[1]) for m in results["matches"] ]
|
|
||||||
else:
|
|
||||||
o_files = [ discord.File(Path(util.config["memetics"]["memes_local"]) / util.meme_thumbnail(results, m)) for m in results["matches"] ]
|
|
||||||
await ctx.send(files=o_files)
|
|
||||||
|
|
||||||
def setup(bot):
|
def setup(bot):
|
||||||
bot.add_cog(GeneralCommands(bot))
|
bot.add_cog(GeneralCommands(bot))
|
||||||
|
132
src/sentience.py
Normal file
132
src/sentience.py
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
import asyncio
|
||||||
|
import argparse
|
||||||
|
import random
|
||||||
|
from numpy.random import default_rng
|
||||||
|
import re
|
||||||
|
import aiohttp
|
||||||
|
import subprocess
|
||||||
|
import discord.ext.commands as commands
|
||||||
|
import discord
|
||||||
|
from datetime import datetime
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import tio
|
||||||
|
import util
|
||||||
|
|
||||||
|
def render(dt: datetime):
|
||||||
|
return f"{dt.hour:02}:{dt.minute:02}"
|
||||||
|
|
||||||
|
cleaner = commands.clean_content()
|
||||||
|
def clean(ctx, text):
|
||||||
|
return cleaner.convert(ctx, text)
|
||||||
|
|
||||||
|
AUTOGOLLARK_MARKER = "\u200b"
|
||||||
|
AUTOGOLLARK_GOLLARK = "autogollark"
|
||||||
|
|
||||||
|
class Sentience(commands.Cog):
|
||||||
|
def __init__(self, bot):
|
||||||
|
self.bot = bot
|
||||||
|
self.session = aiohttp.ClientSession()
|
||||||
|
|
||||||
|
async def serialize_history(self, ctx, n=20):
|
||||||
|
PREFIXES = [ ctx.prefix + "ai", ctx.prefix + "ag", ctx.prefix + "autogollark", ctx.prefix + "gollark" ]
|
||||||
|
|
||||||
|
prompt = []
|
||||||
|
seen = set()
|
||||||
|
async for message in ctx.channel.history(limit=n):
|
||||||
|
display_name = message.author.display_name
|
||||||
|
if message.author == self.bot.user:
|
||||||
|
display_name = util.config["ai"]["own_name"]
|
||||||
|
content = message.content
|
||||||
|
for prefix in PREFIXES:
|
||||||
|
if content.startswith(prefix):
|
||||||
|
content = content.removeprefix(prefix).lstrip()
|
||||||
|
if not content and message.embeds:
|
||||||
|
content = message.embeds[0].title
|
||||||
|
elif not content and message.attachments:
|
||||||
|
content = "[attachments]"
|
||||||
|
if not content:
|
||||||
|
continue
|
||||||
|
if message.author == self.bot.user:
|
||||||
|
if message.content.startswith(AUTOGOLLARK_MARKER):
|
||||||
|
content = message.content.removeprefix(AUTOGOLLARK_MARKER)
|
||||||
|
display_name = AUTOGOLLARK_GOLLARK
|
||||||
|
|
||||||
|
if content in seen: continue
|
||||||
|
seen.add(content)
|
||||||
|
prompt.append(f"[{render(message.created_at)}] {display_name}: {content}\n")
|
||||||
|
if sum(len(x) for x in prompt) > util.config["ai"]["max_len"]:
|
||||||
|
break
|
||||||
|
prompt.reverse()
|
||||||
|
return prompt
|
||||||
|
|
||||||
|
@commands.command(help="Highly advanced AI Assistant.")
|
||||||
|
async def ai(self, ctx, *, query=None):
|
||||||
|
prompt = await self.serialize_history(ctx)
|
||||||
|
prompt.append(f'[{render(datetime.utcnow())}] {util.config["ai"]["own_name"]}:')
|
||||||
|
generation = await util.generate(self.session, util.config["ai"]["prompt_start"] + "".join(prompt))
|
||||||
|
if generation.strip():
|
||||||
|
await ctx.send(generation.strip())
|
||||||
|
|
||||||
|
@commands.command(help="Emulated gollark instance.", aliases=["gollark", "ag"])
|
||||||
|
async def autogollark(self, ctx):
|
||||||
|
prompt = await self.serialize_history(ctx, n=50)
|
||||||
|
prompt.append(f"[{render(datetime.utcnow())}] {AUTOGOLLARK_GOLLARK}:")
|
||||||
|
conversation = "".join(prompt)
|
||||||
|
# retrieve gollark data from backend
|
||||||
|
gollark_chunks = []
|
||||||
|
async with self.session.post(util.config["ai"]["autogollark_server"], json={"query": conversation}) as res:
|
||||||
|
for chunk in (await res.json()):
|
||||||
|
gollark_chunk = []
|
||||||
|
if sum(len(y) for x in gollark_chunks for y in x) > util.config["ai"]["max_gollark_len"]: gollark_chunks.pop(0)
|
||||||
|
for message in chunk:
|
||||||
|
dt = datetime.fromisoformat(message["timestamp"])
|
||||||
|
line = f"[{render(dt)}] {message['author'] or AUTOGOLLARK_GOLLARK}: {await clean(ctx, message['contents'])}\n"
|
||||||
|
gollark_chunk.append(line)
|
||||||
|
|
||||||
|
# ugly hack to remove duplicates
|
||||||
|
ds = []
|
||||||
|
for chunk in gollark_chunks:
|
||||||
|
if line in chunk and line != "---\n": ds.append(chunk)
|
||||||
|
for d in ds:
|
||||||
|
print("delete chunk", d)
|
||||||
|
try:
|
||||||
|
gollark_chunks.remove(d)
|
||||||
|
except ValueError: pass
|
||||||
|
|
||||||
|
gollark_chunk.append("---\n")
|
||||||
|
gollark_chunks.append(gollark_chunk)
|
||||||
|
|
||||||
|
gollark_data = "".join("".join(x) for x in gollark_chunks)
|
||||||
|
|
||||||
|
print(gollark_data + conversation)
|
||||||
|
|
||||||
|
# generate response
|
||||||
|
generation = await util.generate(self.session, "GOLLARK SAMPLES:\n" + gollark_data + "CONVERSATION:\n" + conversation)
|
||||||
|
print("output", generation)
|
||||||
|
if generation.strip():
|
||||||
|
await ctx.send(AUTOGOLLARK_MARKER + generation.strip())
|
||||||
|
|
||||||
|
@commands.Cog.listener("on_message")
|
||||||
|
async def autogollark_listener(self, message):
|
||||||
|
if message.channel.id in util.config["ai"]["autogollark_channels"] and not message.content.startswith(AUTOGOLLARK_MARKER):
|
||||||
|
await self.autogollark(commands.Context(bot=self.bot, message=message, prefix="", view=None))
|
||||||
|
|
||||||
|
@commands.command(help="Search meme library.", aliases=["memes"])
|
||||||
|
async def meme(self, ctx, *, query=None):
|
||||||
|
search_many = ctx.invoked_with == "memes"
|
||||||
|
raw_memes = await util.user_config_lookup(ctx, "enable_raw_memes") == "true"
|
||||||
|
async with self.session.post(util.config["memetics"]["meme_search_backend"], json={
|
||||||
|
"terms": [{"text": query, "weight": 1}],
|
||||||
|
"k": 20
|
||||||
|
}) as res:
|
||||||
|
results = await res.json()
|
||||||
|
results = results[:(4 if search_many else 1)]
|
||||||
|
if raw_memes:
|
||||||
|
o_files = [ discord.File(Path(util.config["memetics"]["memes_local"]) / Path(util.config["memetics"]["meme_base"]) / m[1]) for m in results["matches"] ]
|
||||||
|
else:
|
||||||
|
o_files = [ discord.File(Path(util.config["memetics"]["memes_local"]) / util.meme_thumbnail(results, m)) for m in results["matches"] ]
|
||||||
|
await ctx.send(files=o_files)
|
||||||
|
|
||||||
|
def setup(bot):
|
||||||
|
bot.add_cog(Sentience(bot))
|
@ -314,7 +314,8 @@ extensions = (
|
|||||||
"userdata",
|
"userdata",
|
||||||
"irc_link",
|
"irc_link",
|
||||||
"search",
|
"search",
|
||||||
"esoserver"
|
"esoserver",
|
||||||
|
"sentience"
|
||||||
)
|
)
|
||||||
|
|
||||||
# https://github.com/SawdustSoftware/simpleflake/blob/master/simpleflake/simpleflake.py
|
# https://github.com/SawdustSoftware/simpleflake/blob/master/simpleflake/simpleflake.py
|
||||||
|
Loading…
x
Reference in New Issue
Block a user