Update bot.py
asynchronous processing and a basic structure for handling user-specific contexts. Needs further testing.
This commit is contained in:
parent
b101e7b7f0
commit
c5eec48876
80
bot.py
80
bot.py
|
@ -5,7 +5,9 @@ import configparser
|
|||
import openai
|
||||
import time
|
||||
import textwrap
|
||||
import asyncio
|
||||
|
||||
# Configuration and Initialization
|
||||
config = configparser.ConfigParser()
|
||||
config.read('/path/to/config/config.ini')
|
||||
openai.api_key = config['openai']['api_key']
|
||||
|
@ -16,7 +18,7 @@ botnick = "Nickname"
|
|||
nspass = "NICKSERV_PASSWORD"
|
||||
modeset = "+B"
|
||||
|
||||
print(channel)
|
||||
# Connect to IRC
|
||||
irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
irc.connect((server, 6667))
|
||||
irc.send(bytes("USER "+ botnick +" "+ botnick +" "+ botnick + " " + botnick + "\n", "UTF-8"))
|
||||
|
@ -27,51 +29,51 @@ time.sleep(5)
|
|||
irc.send(bytes("MODE "+ botnick +" "+ modeset +"\n", "UTF-8"))
|
||||
time.sleep(5)
|
||||
irc.send(bytes("JOIN "+ channel +" "+ server +"\n", "UTF-8"))
|
||||
response = irc.recv(2040).decode("UTF-8")
|
||||
if "JOIN " + channel in response:
|
||||
print("Joined channel", channel)
|
||||
else:
|
||||
print("Error joining channel", channel)
|
||||
|
||||
# Message Handling
|
||||
async def handle_messages():
|
||||
user_contexts = {}
|
||||
while True:
|
||||
text = irc.recv(2040).decode("UTF-8")
|
||||
print(text)
|
||||
|
||||
# Read and discard any messages in the channel for the next 30 seconds
|
||||
start_time = time.time()
|
||||
while time.time() - start_time < 15:
|
||||
text = irc.recv(2040).decode("UTF-8")
|
||||
if text.find('PING') != -1:
|
||||
irc.send(bytes('PONG ' + text.split()[1] + '\r\n', "UTF-8"))
|
||||
|
||||
if "PRIVMSG" in text and botnick in text:
|
||||
username, prompt = parse_message(text)
|
||||
context = user_contexts.get(username, [])
|
||||
|
||||
# Now start responding to new messages
|
||||
context.append({"role": "user", "content": prompt})
|
||||
if len(context) > max_history_length:
|
||||
context.pop(0)
|
||||
|
||||
previous_messages = []
|
||||
max_history_length = 10
|
||||
response = await get_openai_response(context)
|
||||
reply = response['choices'][0]['message']['content']
|
||||
print(reply)
|
||||
|
||||
while True:
|
||||
text=irc.recv(2040).decode("UTF-8")
|
||||
print(text)
|
||||
for chunk in textwrap.wrap(reply, 200):
|
||||
irc.send(bytes("PRIVMSG "+ channel +" :"+ chunk +"\n", "UTF-8"))
|
||||
user_contexts[username] = context
|
||||
|
||||
if text.find('PING') != -1:
|
||||
irc.send(bytes('PONG ' + text.split()[1] + '\r\n', "UTF-8"))
|
||||
async def get_openai_response(context):
|
||||
return openai.ChatCompletion.create(
|
||||
model="gpt-3.5-turbo",
|
||||
messages=context,
|
||||
temperature=0.85,
|
||||
max_tokens=150,
|
||||
top_p=1,
|
||||
frequency_penalty=0.5,
|
||||
presence_penalty=1.0,
|
||||
)
|
||||
|
||||
if "PRIVMSG" in text and botnick in text:
|
||||
prompt = text.split(botnick)[1].strip()
|
||||
previous_messages.append({"role": "system", "content": "You are a IRC chat bot for interacting with users using short answers only"})
|
||||
previous_messages.append({"role": "user", "content": prompt})
|
||||
def parse_message(text):
|
||||
# Implement message parsing logic here
|
||||
pass
|
||||
|
||||
if len(previous_messages) > max_history_length:
|
||||
previous_messages.pop(0)
|
||||
response = openai.ChatCompletion.create(
|
||||
model="gpt-3.5-turbo",
|
||||
messages=previous_messages,
|
||||
temperature=0.85,
|
||||
max_tokens=150,
|
||||
top_p=1,
|
||||
frequency_penalty=0.5,
|
||||
presence_penalty=1.0,
|
||||
)
|
||||
# Main
|
||||
async def main():
|
||||
await handle_messages()
|
||||
|
||||
print("Sending:", response)
|
||||
reply = response['choices'][0]['message']['content']
|
||||
print(reply)
|
||||
|
||||
for chunk in textwrap.wrap(reply, 200):
|
||||
irc.send(bytes("PRIVMSG "+ channel +" :"+ chunk +"\n", "UTF-8"))
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
|
|
Loading…
Reference in New Issue