Update o3-base to support non-interactive usage

This commit is contained in:
Juhani Krekelä 2021-12-12 16:46:41 +02:00
commit d755518b3f
3 changed files with 20 additions and 10 deletions

View File

@ -1,5 +1,5 @@
[server] [server]
host = irc.freenode.net host = irc.libera.chat
port = 6667 port = 6667
nick = oonbotti2 nick = oonbotti2
username = oonbotti2 username = oonbotti2

View File

@ -4,7 +4,7 @@ class logmessage_types(enum.Enum):
sent, received, internal, status = range(4) sent, received, internal, status = range(4)
class internal_submessage_types(enum.Enum): class internal_submessage_types(enum.Enum):
quit, error = range(2) quit, error, server = range(3)
class controlmessage_types(enum.Enum): class controlmessage_types(enum.Enum):
quit, reconnect, send_line, ping, ping_timeout = range(5) quit, reconnect, send_line, ping, ping_timeout = range(5)

View File

@ -2,6 +2,7 @@
import configparser import configparser
import select import select
import socket import socket
import sys
import threading import threading
import time import time
from collections import namedtuple from collections import namedtuple
@ -16,7 +17,8 @@ import line_handling
Server = namedtuple('Server', ['host', 'port', 'nick', 'username', 'realname', 'channels']) Server = namedtuple('Server', ['host', 'port', 'nick', 'username', 'realname', 'channels'])
class LoggerThread(threading.Thread): class LoggerThread(threading.Thread):
def __init__(self, logging_channel, dead_notify_channel): def __init__(self, interactive_console, logging_channel, dead_notify_channel):
self.interactive_console = interactive_console
self.logging_channel = logging_channel self.logging_channel = logging_channel
self.dead_notify_channel = dead_notify_channel self.dead_notify_channel = dead_notify_channel
@ -29,11 +31,11 @@ class LoggerThread(threading.Thread):
# Lines that were sent between server and client # Lines that were sent between server and client
if message_type == logmessage_types.sent: if message_type == logmessage_types.sent:
assert len(message_data) == 1 assert len(message_data) == 1
print('>' + message_data[0]) if self.interactive_console: print('>' + message_data[0])
elif message_type == logmessage_types.received: elif message_type == logmessage_types.received:
assert len(message_data) == 1 assert len(message_data) == 1
print('<' + message_data[0]) if self.interactive_console: print('<' + message_data[0])
# Messages that are from internal components # Messages that are from internal components
elif message_type == logmessage_types.internal: elif message_type == logmessage_types.internal:
@ -48,6 +50,11 @@ class LoggerThread(threading.Thread):
assert len(message_data) == 2 assert len(message_data) == 2
print('--- Error', message_data[1]) print('--- Error', message_data[1])
elif message_data[0] == internal_submessage_types.server:
assert len(message_data) == 2
assert len(message_data[1]) == 2
print(f'--- Connecting to server {message_data[1][0]}:{message_data[1][1]}')
else: else:
print('--- ???', message_data) print('--- ???', message_data)
@ -293,6 +300,7 @@ class ServerThread(threading.Thread):
while True: while True:
# Connect to given server # Connect to given server
address = (self.server.host, self.server.port) address = (self.server.host, self.server.port)
self.logging_channel.send((logmessage_types.internal, internal_submessage_types.server, address))
try: try:
self.server_socket = socket.create_connection(address) self.server_socket = socket.create_connection(address)
except (ConnectionRefusedError, socket.gaierror): except (ConnectionRefusedError, socket.gaierror):
@ -391,12 +399,12 @@ def spawn_serverthread(server, auth, cron_control_channel, logging_channel):
ServerThread(server, auth, control_channel, cron_control_channel, logging_channel).start() ServerThread(server, auth, control_channel, cron_control_channel, logging_channel).start()
return control_channel return control_channel
# spawn_loggerthread() → logging_channel, dead_notify_channel # spawn_loggerthread(interactive_console) → logging_channel, dead_notify_channel
# Spawn logger thread and returns the channel it logs and the channel it uses to notify about quiting # Spawn logger thread and returns the channel it logs and the channel it uses to notify about quiting
def spawn_loggerthread(): def spawn_loggerthread(interactive_console):
logging_channel = channel.Channel() logging_channel = channel.Channel()
dead_notify_channel = channel.Channel() dead_notify_channel = channel.Channel()
LoggerThread(logging_channel, dead_notify_channel).start() LoggerThread(interactive_console, logging_channel, dead_notify_channel).start()
return logging_channel, dead_notify_channel return logging_channel, dead_notify_channel
# read_config() → config, server # read_config() → config, server
@ -423,15 +431,17 @@ def read_config():
return config, server, (user, password) return config, server, (user, password)
if __name__ == '__main__': if __name__ == '__main__':
interactive_console = sys.stdin.isatty()
config, server, auth = read_config() config, server, auth = read_config()
botcmd.initialize(config = config) botcmd.initialize(config = config)
cron_control_channel = cron.start() cron_control_channel = cron.start()
logging_channel, dead_notify_channel = spawn_loggerthread() logging_channel, dead_notify_channel = spawn_loggerthread(interactive_console)
control_channel = spawn_serverthread(server, auth, cron_control_channel, logging_channel) control_channel = spawn_serverthread(server, auth, cron_control_channel, logging_channel)
while True: while interactive_console:
message = dead_notify_channel.recv(blocking = False) message = dead_notify_channel.recv(blocking = False)
if message is not None: if message is not None:
if message[0] == controlmessage_types.quit: if message[0] == controlmessage_types.quit: