File size: 6,224 Bytes
1e6a278
 
 
15b5332
 
 
1e6a278
15b5332
 
1e6a278
15b5332
 
 
 
 
 
 
 
 
 
1e6a278
 
 
 
 
 
 
 
4bfaa35
 
 
 
 
 
 
 
 
 
 
1e6a278
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e72ad7d
1e6a278
 
 
 
 
f9c615f
15b5332
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1e6a278
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f9c615f
1e6a278
f9c615f
1e6a278
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f9c615f
 
 
 
 
 
 
 
 
 
 
 
acdcbfe
51df2de
cdc3506
 
 
f9c615f
cdc3506
acdcbfe
 
51df2de
 
 
acdcbfe
 
 
51df2de
6a17d45
15b5332
cdc3506
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
import http.server
import asyncio
import json
import random
import datetime
import sqlite3
import time
import websockets
import gradio as gr

client_messages = []  # List to store client messages
server_responses = []  # List to store server responses
messages = []  # List to store all messages
used_ports = []  # List to store used WebSocket ports

# Set up the SQLite database
db = sqlite3.connect('chat-hub.db')
cursor = db.cursor()
cursor.execute('CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY AUTOINCREMENT, sender TEXT, message TEXT, timestamp TEXT)')
db.commit()

websocket_server = None
stop = asyncio.Future()

# Global variables to store references to the textboxes
messageTextbox = None
serverMessageTextbox = None

def slow_echo(message, history):
    for i in range(len(message)):
        time.sleep(0.3)
        yield "You typed: " + message[: i+1]

# Define a function to read the HTML file
def read_html_file(file_name):
    with open(file_name, 'r') as file:
        html_content = file.read()
    return html_content        

# Set up the HTTP server
class SimpleHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/':
            self.send_response(200)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
            with open('index.html', 'rb') as file:
                self.wfile.write(file.read())
        else:
            self.send_response(404)
            self.end_headers()

# Set up the SQLite database
db = sqlite3.connect('chat-hub.db')
cursor = db.cursor()
cursor.execute('CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY AUTOINCREMENT, sender TEXT, message TEXT, timestamp TEXT)')    
db.commit()     

# Define the function for sending an error message
def sendErrorMessage(ws, errorMessage):
    errorResponse = {'error': errorMessage}
    ws.send(json.dumps(errorResponse))
    

async def handle_message(client_responses, user_input, user_message, history):
    client_responses.append(user_input)
    # Provide a response to the user
    return "You typed: " + user_message, history + [[user_message, None]]

async def ask_question(agent_responses, user_input, user_message):
    agent_responses.append(user_input)
    bot_message = random.choice(["How are you?", "I love you", "I'm very hungry"])
    return bot_message
    
# Define the WebSocket server handler
async def websocket_server(ws, path):
    async for message in ws:
        # Handle incoming WebSocket messages using the handle_message function
        response, _ = await handle_message(client_messages, message, message, [])
        await ws.send(response)

async def handleWebSocket(ws):
    print('New connection')
    await ws.send('Hello! You are now entering a chat room for AI agents working as instances of NeuralGPT. Keep in mind that you are speaking with another chatbot')
    while True:
        message = await ws.recv()
        message_copy = message
        client_messages.append(message_copy)
        print(f'Received message: {message}')
        messageText = message
        messages.append(message)
        timestamp = datetime.datetime.now().isoformat()
        sender = 'client'
        db = sqlite3.connect('chat-hub.db')
        db.execute('INSERT INTO messages (sender, message, timestamp) VALUES (?, ?, ?)',
                   (sender, messageText, timestamp))
        db.commit()        
        try:
            message = client_messages[-1]
            answer = await askQuestion(message)  # Use the message directly
            messages.append(answer)
            response = {'answer': answer}
            serverMessageText = response.get('answer', '')        
            await ws.send(json.dumps(response))
            # Append the server response to the server_responses list
            server_responses.append(serverMessageText)
            serverSender = 'server'
            db.execute('INSERT INTO messages (sender, message, timestamp) VALUES (?, ?, ?)',
                           (serverSender, serverMessageText, timestamp))
            db.commit()

        except websockets.exceptions.ConnectionClosedError as e:
            print(f"Connection closed: {e}")

        except Exception as e:
            print(f"Error: {e}")


# Function to stop the WebSocket server
def stop_websockets():
    global websocket_server
    if websocket_server:
        cursor.close()
        db.close()
        websocket_server.close()
        print("WebSocket server stopped.")
    else:
        print("WebSocket server is not running.")    

# Start the WebSocket server 
async def start_websockets(websocketPort):
    global messageTextbox, serverMessageTextbox, websocket_server
    # Create a WebSocket client that connects to the server    
      
    await(websockets.serve(handleWebSocket, 'localhost', websocketPort))
    used_ports.append(websocketPort)
    print(f"Starting WebSocket server on port {websocketPort}...")
    return "Used ports:\n" + '\n'.join(map(str, used_ports))

async def start_client():
    async with websockets.connect('ws://localhost:5000') as ws:        
        while True:
            # Listen for messages from the server            
            server_message = await ws.recv()
            server_responses.append(server_message)
            messages.append(server_message)
            client_response = await askQuestion2(server_message)
            client_messages.append(client_response)
            await ws.send(client_response)
            return server_message
            await asyncio.sleep(0.1)


async def start_websocket_server():
    server = await websockets.serve(websocket_server, "localhost", 8765)  # Set your desired WebSocket server parameters
    await server.wait_closed()

if __name__ == "__main__":
    demo = gr.Interface(
        fn=handle_message,
        inputs="text",  # Change this to the appropriate input type
        outputs="text",  # Change this to the appropriate output type
        live=False,
        title="Chatbot Interface",
        description="Enter your message and get a response.",
    )

    demo.launch(server_name="0.0.0.0", server_port=8765)
    
    asyncio.run(start_websocket_server())