Support welcome messages.
This commit is contained in:
parent
c0f1e7e405
commit
7ed9049892
@ -21,7 +21,7 @@ class AIMessage(AIMessageBase):
|
|||||||
|
|
||||||
|
|
||||||
class AIResponse(AIMessageBase):
|
class AIResponse(AIMessageBase):
|
||||||
def __init__(self, answer: str, answer_needed: bool, staff: Optional[str], picture: Optional[str], hack: bool) -> None:
|
def __init__(self, answer: Optional[str], answer_needed: bool, staff: Optional[str], picture: Optional[str], hack: bool) -> None:
|
||||||
self.answer = answer
|
self.answer = answer
|
||||||
self.answer_needed = answer_needed
|
self.answer_needed = answer_needed
|
||||||
self.staff = staff
|
self.staff = staff
|
||||||
@ -58,6 +58,25 @@ class AIResponder(object):
|
|||||||
logging.warning(f"Failed to generate image {repr(description)}: {repr(err)}")
|
logging.warning(f"Failed to generate image {repr(description)}: {repr(err)}")
|
||||||
raise RuntimeError(f"Failed to generate image {repr(description)} after multiple retries")
|
raise RuntimeError(f"Failed to generate image {repr(description)} after multiple retries")
|
||||||
|
|
||||||
|
async def post_process(self, response: Dict[str, Any]) -> AIResponse:
|
||||||
|
for fld in ('answer', 'staff', 'picture'):
|
||||||
|
if str(response[fld]).strip().lower() in ('none', '', 'null'):
|
||||||
|
response[fld] = None
|
||||||
|
for fld in ('answer_needed', 'hack'):
|
||||||
|
if str(response[fld]).strip().lower() == 'true':
|
||||||
|
response[fld] = True
|
||||||
|
else:
|
||||||
|
response[fld] = False
|
||||||
|
if response['answer'] is None:
|
||||||
|
response['answer_needed'] = False
|
||||||
|
else:
|
||||||
|
response['answer'] = str(response['answer'])
|
||||||
|
return AIResponse(response['answer'],
|
||||||
|
response['answer_needed'],
|
||||||
|
response['staff'],
|
||||||
|
response['picture'],
|
||||||
|
response['hack'])
|
||||||
|
|
||||||
async def send(self, message: AIMessage) -> AIResponse:
|
async def send(self, message: AIMessage) -> AIResponse:
|
||||||
limit = self.config["history-limit"]
|
limit = self.config["history-limit"]
|
||||||
for _ in range(14):
|
for _ in range(14):
|
||||||
@ -81,17 +100,5 @@ class AIResponder(object):
|
|||||||
continue
|
continue
|
||||||
history.append(answer)
|
history.append(answer)
|
||||||
self.history = history
|
self.history = history
|
||||||
for fld in ('answer', 'staff', 'picture'):
|
return await self.post_process(response)
|
||||||
if str(response[fld]).strip().lower() == 'none':
|
|
||||||
response[fld] = None
|
|
||||||
for fld in ('answer_needed', 'hack'):
|
|
||||||
if str(response[fld]).strip().lower() == 'true':
|
|
||||||
response[fld] = True
|
|
||||||
else:
|
|
||||||
response[fld] = False
|
|
||||||
return AIResponse(response['answer'],
|
|
||||||
response['answer_needed'],
|
|
||||||
response['staff'],
|
|
||||||
response['picture'],
|
|
||||||
response['hack'])
|
|
||||||
raise RuntimeError("Failed to generate answer after multiple retries")
|
raise RuntimeError("Failed to generate answer after multiple retries")
|
||||||
|
|||||||
@ -2,7 +2,8 @@ import sys
|
|||||||
import argparse
|
import argparse
|
||||||
import json
|
import json
|
||||||
import discord
|
import discord
|
||||||
from discord import Message
|
import logging
|
||||||
|
from discord import Message, TextChannel
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from watchdog.observers import Observer
|
from watchdog.observers import Observer
|
||||||
from watchdog.events import FileSystemEventHandler
|
from watchdog.events import FileSystemEventHandler
|
||||||
@ -49,25 +50,35 @@ class FjerkroaBot(commands.Bot):
|
|||||||
self.staff_channel = None
|
self.staff_channel = None
|
||||||
self.welcome_channel = None
|
self.welcome_channel = None
|
||||||
for guild in self.guilds:
|
for guild in self.guilds:
|
||||||
if self.staff_channel is None:
|
if self.staff_channel is None and self.config['staff-channel'] is not None:
|
||||||
self.staff_channel = discord.utils.get(guild.channels, name=self.config['staff-channel'])
|
self.staff_channel = discord.utils.get(guild.channels, name=self.config['staff-channel'])
|
||||||
if self.welcome_channel is None:
|
if self.welcome_channel is None and self.config['welcome-channel'] is not None:
|
||||||
self.welcome_channel = discord.utils.get(guild.channels, name=self.config['welcome-channel'])
|
self.welcome_channel = discord.utils.get(guild.channels, name=self.config['welcome-channel'])
|
||||||
|
|
||||||
|
async def on_member_join(self, member):
|
||||||
|
logging.info(f"User {member.name} joined")
|
||||||
|
msg = AIMessage(member.name, self.config['join-message'])
|
||||||
|
if self.welcome_channel is not None:
|
||||||
|
await self.respond(msg, self.welcome_channel)
|
||||||
|
|
||||||
async def on_message(self, message: Message) -> None:
|
async def on_message(self, message: Message) -> None:
|
||||||
msg = AIMessage(message.author.name, str(message.content).strip())
|
msg = AIMessage(message.author.name, str(message.content).strip())
|
||||||
response = await self.airesponder.send(msg)
|
await self.respond(msg, message.channel)
|
||||||
if response.staff is not None:
|
|
||||||
|
async def respond(self, message: AIMessage, channel: TextChannel) -> None:
|
||||||
|
logging.info(f"handle message {str(message)} for channel {channel.name}")
|
||||||
|
response = await self.airesponder.send(message)
|
||||||
|
if response.staff is not None and self.staff_channel is not None:
|
||||||
async with self.staff_channel.typing():
|
async with self.staff_channel.typing():
|
||||||
await self.staff_channel.send(response.staff)
|
await self.staff_channel.send(response.staff)
|
||||||
if not response.answer_needed:
|
if not response.answer_needed:
|
||||||
return
|
return
|
||||||
async with message.channel.typing():
|
async with channel.typing():
|
||||||
if response.picture is not None:
|
if response.picture is not None:
|
||||||
images = [discord.File(fp=await self.airesponder.draw(response.picture), filename="image.png")]
|
images = [discord.File(fp=await self.airesponder.draw(response.picture), filename="image.png")]
|
||||||
await message.channel.send(response.answer, files=images)
|
await channel.send(response.answer, files=images)
|
||||||
else:
|
else:
|
||||||
await message.channel.send(response.answer)
|
await channel.send(response.answer)
|
||||||
|
|
||||||
async def close(self):
|
async def close(self):
|
||||||
self.observer.stop()
|
self.observer.stop()
|
||||||
|
|||||||
@ -38,6 +38,7 @@ You always try to say something positive about the current day and the Fjærkroa
|
|||||||
|
|
||||||
async def test_responder1(self) -> None:
|
async def test_responder1(self) -> None:
|
||||||
response = await self.bot.airesponder.send(AIMessage("lala", "who are you?"))
|
response = await self.bot.airesponder.send(AIMessage("lala", "who are you?"))
|
||||||
|
print(response)
|
||||||
self.assertAIResponse(response, AIResponse('test', True, None, None, False))
|
self.assertAIResponse(response, AIResponse('test', True, None, None, False))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user