This commit is contained in:
deepend-tildeclub 2024-01-22 09:17:36 -07:00 committed by GitHub
commit d9c89cefcc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 59 additions and 38 deletions

97
bot.py
View File

@ -5,7 +5,9 @@ import configparser
import openai import openai
import time import time
import textwrap import textwrap
import asyncio
# Configuration and Initialization
config = configparser.ConfigParser() config = configparser.ConfigParser()
config.read('/path/to/config/config.ini') config.read('/path/to/config/config.ini')
openai.api_key = config['openai']['api_key'] openai.api_key = config['openai']['api_key']
@ -16,7 +18,7 @@ botnick = "Nickname"
nspass = "NICKSERV_PASSWORD" nspass = "NICKSERV_PASSWORD"
modeset = "+B" modeset = "+B"
print(channel) # Connect to IRC
irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
irc.connect((server, 6667)) irc.connect((server, 6667))
irc.send(bytes("USER "+ botnick +" "+ botnick +" "+ botnick + " " + botnick + "\n", "UTF-8")) irc.send(bytes("USER "+ botnick +" "+ botnick +" "+ botnick + " " + botnick + "\n", "UTF-8"))
@ -27,51 +29,70 @@ time.sleep(5)
irc.send(bytes("MODE "+ botnick +" "+ modeset +"\n", "UTF-8")) irc.send(bytes("MODE "+ botnick +" "+ modeset +"\n", "UTF-8"))
time.sleep(5) time.sleep(5)
irc.send(bytes("JOIN "+ channel +" "+ server +"\n", "UTF-8")) 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 if text.find('PING') != -1:
start_time = time.time() irc.send(bytes('PONG ' + text.split()[1] + '\r\n', "UTF-8"))
while time.time() - start_time < 15:
text = irc.recv(2040).decode("UTF-8")
if "PRIVMSG" in text:
username, message = parse_message(text)
if username and message:
if message.startswith('!'):
await handle_command(username, message)
else:
await handle_conversation(username, message, user_contexts)
# Now start responding to new messages async def handle_conversation(username, message, user_contexts):
context = user_contexts.get(username, [])
context.append({"role": "user", "content": message})
if len(context) > 10: # Adjust history length as needed
context.pop(0)
previous_messages = [] response = await get_openai_response(context)
max_history_length = 10 reply = response['choices'][0]['message']['content']
print(reply)
while True: for chunk in textwrap.wrap(reply, 200):
text=irc.recv(2040).decode("UTF-8") irc.send(bytes("PRIVMSG "+ channel +" :"+ chunk +"\n", "UTF-8"))
print(text) user_contexts[username] = context
if text.find('PING') != -1: async def get_openai_response(context):
irc.send(bytes('PONG ' + text.split()[1] + '\r\n', "UTF-8")) 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: def parse_message(text):
prompt = text.split(botnick)[1].strip() if botnick in text:
previous_messages.append({"role": "system", "content": "You are a IRC chat bot for interacting with users using short answers only"}) parts = text.split('!')
previous_messages.append({"role": "user", "content": prompt}) username = parts[0].split(':')[1]
message = parts[1].split(':')[1]
return username, message
return None, None
if len(previous_messages) > max_history_length: async def handle_command(username, command):
previous_messages.pop(0) if command.startswith('!help'):
response = openai.ChatCompletion.create( send_message(f"Hello {username}, I'm a GPT-powered IRC bot. Ask me anything!")
model="gpt-3.5-turbo", # Add more commands as needed
messages=previous_messages,
temperature=0.85,
max_tokens=150,
top_p=1,
frequency_penalty=0.5,
presence_penalty=1.0,
)
print("Sending:", response) def send_message(message):
reply = response['choices'][0]['message']['content'] for chunk in textwrap.wrap(message, 200):
print(reply) irc.send(bytes("PRIVMSG "+ channel +" :"+ chunk +"\n", "UTF-8"))
for chunk in textwrap.wrap(reply, 200): # Main
irc.send(bytes("PRIVMSG "+ channel +" :"+ chunk +"\n", "UTF-8")) async def main():
await handle_messages()
if __name__ == "__main__":
asyncio.run(main())