Added logic describing app flow
This commit is contained in:
parent
b663d9794e
commit
b0ac577328
111
test_sock_gen.py
111
test_sock_gen.py
|
@ -1,11 +1,73 @@
|
|||
from abots.helpers import jsto, sha256, generator
|
||||
from core.parsers import parse_irc_message
|
||||
from socket import socket, timeout as sock_timeout
|
||||
from socket import AF_INET, SOCK_STREAM
|
||||
from socket import AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
|
||||
from ssl import wrap_socket
|
||||
from time import sleep
|
||||
from re import compile as regex
|
||||
|
||||
"""
|
||||
|
||||
Socket Flow:
|
||||
- Get new messages
|
||||
- Send messages to message queue
|
||||
- Repeat
|
||||
|
||||
App Init Flow:
|
||||
- Initialize state
|
||||
- Start server(s)
|
||||
- Start their clients
|
||||
|
||||
App Flow:
|
||||
- Get new server messages
|
||||
- Get new client messages
|
||||
- Repeat
|
||||
|
||||
Message Queue Flow:
|
||||
- In FIFO order, get next queue entry
|
||||
- Dispatch entry to reducers queue as action
|
||||
- Repeat
|
||||
|
||||
Reducers Flow:
|
||||
- In FIFO order, get next action
|
||||
- Send it to relevant reducer(s)
|
||||
- Change state of application if needed
|
||||
- Dispatch new state to hooks queue
|
||||
- Repeat
|
||||
|
||||
Hooks Flow:
|
||||
- In FIFO order, get new state
|
||||
- Send it to relevant hooks(s)
|
||||
- Run side effects triggered by new state
|
||||
- Send message(s) to socket(s)
|
||||
- Send message(s) to logger queue
|
||||
- Dispatch action(s) to database queue
|
||||
- Dispatch action(s) to reducer(s)
|
||||
- Repeat
|
||||
|
||||
Database Flow:
|
||||
- In FIFO order, get new action
|
||||
- Run action
|
||||
- Send status/result to sender
|
||||
- Repeat
|
||||
|
||||
Logger Flow:
|
||||
- In FIFO order, get new log message
|
||||
- Determine log level
|
||||
- Log message against logger
|
||||
- Repeat
|
||||
|
||||
-> Servers -\ /-> Reducer1 -\
|
||||
/ |-> Messages -> Reducers -+--> Redcuer2 --+-> State -> Listeners
|
||||
|-> Clients -/ ^ ^ \-> Reducer3 -/ | |
|
||||
| | | v v
|
||||
| | | Hook1 Hook2
|
||||
| | | \ /
|
||||
| | | v
|
||||
|____________________|___________|______________________________________/
|
||||
|
||||
"""
|
||||
|
||||
with open("settings.json", "r") as config:
|
||||
settings = jsto(config.read())
|
||||
|
||||
|
@ -24,6 +86,7 @@ join = lambda chan: pack(f"JOIN {chan}")
|
|||
user = lambda name: pack(f"USER {name} - - -")
|
||||
nick = lambda name: pack(f"NICK {name}")
|
||||
iden = lambda pswd: pack(f"PRIVMSG NickServ :IDENTIFY {pswd}")
|
||||
mode = lambda target, flag: pack(f"MODE {target} {flag}")
|
||||
|
||||
def clean(parameters, dirt=":"):
|
||||
params = parameters.partition(dirt)
|
||||
|
@ -32,6 +95,9 @@ def clean(parameters, dirt=":"):
|
|||
hooks = dict()
|
||||
listeners = dict()
|
||||
state = dict()
|
||||
sockets = dict()
|
||||
sockets["server"] = dict()
|
||||
sockets["clients"] = dict()
|
||||
|
||||
channel_modes = dict()
|
||||
channel_modes["@"] = "secret"
|
||||
|
@ -126,17 +192,15 @@ def identify(cancel):
|
|||
return
|
||||
if meta.get("command") != "MODE": return
|
||||
if " " not in params: return
|
||||
name, mode = clean(params).split(" ", 1)
|
||||
if mode == "+r":
|
||||
name, flag = clean(params).split(" ", 1)
|
||||
if flag == "+r":
|
||||
cancel()
|
||||
subscribe_many("tilde", ["handle_332", "handle_333", "handle_353",
|
||||
"handle_366"])
|
||||
sock.send(mode(name, "+B"))
|
||||
if "channels" not in state:
|
||||
state["channels"] = dict()
|
||||
channels = state["channels"]
|
||||
bots = "#bots"
|
||||
channels[bots] = dict()
|
||||
sock.send(join(bots))
|
||||
for chan in auto:
|
||||
channels[chan] = dict()
|
||||
sock.send(join(chan))
|
||||
|
@ -184,9 +248,38 @@ def handle_366(cancel):
|
|||
chan = state["channels"][channel]
|
||||
print(chan)
|
||||
|
||||
sock = wrap_socket(socket(AF_INET, SOCK_STREAM))
|
||||
sock.connect((host, port))
|
||||
subscribe_many("tilde", ["loading", "ping"])
|
||||
socket_servers = sockets["servers"]
|
||||
for server_type, servers in settings.get("servers", dict()).items():
|
||||
if server_type not in socket_servers:
|
||||
socket_servers[server_type] = dict()
|
||||
socket_type_servers = socket_servers[server_type]
|
||||
for server_name, server_info in servers.items():
|
||||
server_full_name = "/".join([server_type, server_name])
|
||||
server_sock = wrap_socket(socket(AF_INET, SOCK_STREAM))
|
||||
server_sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
|
||||
server_host = server_info.get("host", "")
|
||||
server_port = server_info.get("port", 0)
|
||||
try:
|
||||
server_sock.bind((server_host, server_port))
|
||||
except (BrokenPipeError, OSError) as e:
|
||||
continue
|
||||
server_sock.setblocking(0)
|
||||
server_sock.settimeout(0)
|
||||
socket_type_server[server_name] = dict()server_sock
|
||||
socket_type_server[server_name]["sock"] = server_sock
|
||||
socket_type_server[server_name]["clients"] = dict()
|
||||
server_clients = socket_type_server[server_name]["clients"]
|
||||
for client_type, clients in server_info.get("clients", dict()).items():
|
||||
if client_type not in server_clients:
|
||||
server_clients[client_type] = dict()
|
||||
socket_type_clients = server_clients[client_type]
|
||||
for client_name, client_info in clients.items():
|
||||
client_full_name = "/".join([client_type, client_name])
|
||||
client_sock = wrap_socket(socket(AF_INET, SOCK_STREAM))
|
||||
client_sock.connect((host, port))
|
||||
socket_type_clients[client-name] = dict()
|
||||
socket_type_clients[client-name]["sock"] = client_sock
|
||||
#subscribe_many(client_type, ["loading", "ping"])
|
||||
|
||||
while True:
|
||||
try:
|
||||
|
|
Loading…
Reference in New Issue