From c93d42c7e5d5fce8be05c0f539d8b26d607c18c0 Mon Sep 17 00:00:00 2001 From: beeblebroxian <129529466+beeblebroxian@users.noreply.github.com> Date: Fri, 31 Mar 2023 17:08:01 +0200 Subject: [PATCH] updates --- README.md | 32 ++++++++++---------- chatgpt.py | 74 ++++++++++++++++++++++++++++++++++------------- example-chat.conf | 16 +++++++++- 3 files changed, 84 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index b33bea1..9c9e5f0 100644 --- a/README.md +++ b/README.md @@ -24,27 +24,25 @@ Edit chat.conf and change variables. Example configuration for IRCNet: [openai] api_key = sk-XXXXXXXXXXXXXXX +[chatcompletion] +model = gpt-3.5-turbo +role = user +temperature = 0.8 +max_tokens = 1000 +top_p = 1 +frequency_penalty = 0 +presence_penalty = 0 +request_timeout = 30 + [irc] server = open.ircnet.net port = 6667 -channel = #irc +ssl = false +channels = #knrd1,#github nickname = MyBot -``` -### Optional settings: - -You can optionally adjust following settings in chatgpt.py, please see docs for more details: -https://platform.openai.com/docs/api-reference/completions -``` -temperature=0.8, -max_tokens=1000, -top_p=1, -frequency_penalty=0, -presence_penalty=0 -request_timeout=30 -``` -Also, you can edit the model, the list of compatible models below: -``` -model="gpt-3.5-turbo", +ident = mybot +realname = My Bot +password = ``` ### Connecting bot to IRC server: ``` diff --git a/chatgpt.py b/chatgpt.py index 510b688..20a0f16 100644 --- a/chatgpt.py +++ b/chatgpt.py @@ -1,5 +1,6 @@ import openai import socket +import ssl import time import configparser from typing import Union, Tuple @@ -11,21 +12,42 @@ config.read('chat.conf') # Set up OpenAI API key openai.api_key = config.get('openai', 'api_key') +# Set up ChatCompletion parameters +model = config.get('chatcompletion', 'model') +role = config.get('chatcompletion', 'role') +temperature = config.getfloat('chatcompletion', 'temperature') +max_tokens = config.getint('chatcompletion', 'max_tokens') +top_p = config.getint('chatcompletion', 'top_p') +frequency_penalty = config.getint('chatcompletion', 'frequency_penalty') +presence_penalty = config.getint('chatcompletion', 'presence_penalty') +request_timeout = config.getint('chatcompletion', 'request_timeout') + # Set up IRC connection settings server = config.get('irc', 'server') port = config.getint('irc', 'port') -channel = config.get('irc', 'channel') +usessl = config.getboolean('irc', 'ssl') +channels = config.get('irc', 'channels').split(',') nickname = config.get('irc', 'nickname') +ident = config.get('irc', 'ident') +realname = config.get('irc', 'realname') +password = config.get('irc', 'password') # Connect to IRC server while True: try: - print ("connecting to:" + server) + print ("Connecting to:" + server) irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) irc.connect((server, port)) - irc.send(bytes("USER " + nickname + " " + nickname + " " + nickname + " :" + nickname + "\n", "UTF-8")) + if usessl: + context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + context.check_hostname = False + context.verify_mode = ssl.CERT_NONE + irc = context.wrap_socket(irc, server_hostname=server) + if password: + irc.send(bytes("PASS " + password + "\n", "UTF-8")) + irc.send(bytes("USER " + ident + " 0 * :" + realname + "\n", "UTF-8")) irc.send(bytes("NICK " + nickname + "\n", "UTF-8")) - irc.send(bytes("JOIN " + channel + "\n", "UTF-8")) + irc.send(bytes("JOIN " + ",".join(channels) + "\n", "UTF-8")) print ("connected to:" + server) break except: @@ -35,26 +57,38 @@ while True: # Listen for messages from users while True: try: - message = irc.recv(2048).decode("UTF-8") + data = irc.recv(4096).decode("UTF-8") except UnicodeDecodeError: continue - if message.find("PING") != -1: - irc.send(bytes("PONG " + message.split()[1] + "\n", "UTF-8")) - elif message.find("KICK " + channel + " " + nickname) != -1: - irc.send(bytes("JOIN " + channel + "\n", "UTF-8")) - print("Kicked from channel. Rejoining...") - elif message.find("PRIVMSG " + channel + " :" + nickname + ":") != -1: - question = message.split(nickname + ":")[1].strip() + chunk = data.split() + if data.startswith(":"): + command = chunk[1] + else: + command = chunk[0] + if command == "PING": + irc.send(bytes("PONG " + chunk[1] + "\n", "UTF-8")) + elif command == "471" or command == "473" or command == "474" or command == "475": + print("Unable to join " + chunk[3] + ": it can be full, invite only, bot is banned or need a key.") + elif command == "KICK" and chunk[3] == nickname: + irc.send(bytes("JOIN " + chunk[2] + "\n", "UTF-8")) + print("Kicked from channel " + chunk[2] + ". Rejoining...") + elif command == "INVITE": + if data.split(" :")[1].strip() in channels: + irc.send(bytes("JOIN " + data.split(" :")[1].strip() + "\n", "UTF-8")) + print("Invited into channel " + data.split(" :")[1].strip() + ". Joining...") + elif command == "PRIVMSG" and chunk[2].startswith("#") and chunk[3] == ":" + nickname + ":": + channel = chunk[2].strip() + question = data.split(nickname + ":")[1].strip() try: response = openai.ChatCompletion.create( - model="gpt-3.5-turbo", - messages=[{"role": "user", "content": question}], - temperature=0.8, - max_tokens=1000, - top_p=1, - frequency_penalty=0, - presence_penalty=0, - request_timeout=30 + model=model, + messages=[{"role": role, "content": question}], + temperature=temperature, + max_tokens=max_tokens, + top_p=top_p, + frequency_penalty=frequency_penalty, + presence_penalty=presence_penalty, + request_timeout=request_timeout ) answers = [x.strip() for x in response.choices[0].message.content.strip().split('\n')] for answer in answers: diff --git a/example-chat.conf b/example-chat.conf index 7b5dc90..0e22403 100644 --- a/example-chat.conf +++ b/example-chat.conf @@ -1,8 +1,22 @@ [openai] api_key = sk-XXXXXXXXXXXXXXX +[chatcompletion] +model = gpt-3.5-turbo +role = user +temperature = 0.8 +max_tokens = 1000 +top_p = 1 +frequency_penalty = 0 +presence_penalty = 0 +request_timeout = 30 + [irc] server = open.ircnet.net port = 6667 -channel = #ircnet +ssl = false +channels = #knrd1,#github nickname = MyBot +ident = mybot +realname = My Bot +password =