Projects : yrc : genesis

codemap.txt

Dir - Raw

1Record types
2============
3
4conn
5- network: file-safe str
6- sock: socket
7- rdbuf: str
8- wrbuf: str
9- addrs: non-empty list of (host: str, port: int) (first entry is current)
10- nick: str
11- password: str | None
12- registered: bool
13- channels: dict of (channel: casemapped str) => (set of nick: casemapped str)
14- casemapper: function of (str -> casemapped str)
15- reconn_delay: int
16- count: int (number of times connected)
17- ping_ts: float (monotonic time of last sent ping)
18- pong_ts: float (monotonic time of last received pong)
19
20buf
21- name: str
22- parent: buf
23- title: str
24- vscroll: int
25- lines: list of str
26- num_read: int
27- at_end: bool
28
29buflist (singleton)
30- vscroll: int
31- width: int
32- selection: buf
33- cursor: buf
34- last: buf
35
36prompt (singleton)
37- chars: list of str
38- cursor: int
39- hscroll: int
40
41flags (singleton)
42- refresh
43- redraw
44- buflist_draw
45- buf_draw
46- prompt_draw
47- status_draw
48- quit
49- buflist
50- prompt
51- ping_draw
52
53Enumerations
54============
55
56kbd_state: ks_start ks_cx ks_esc ks_cseq ks_cs_intermed
57
58Variant types
59=============
60
61message: (args all str unless noted)
62- m_privmsg(sender, msg)
63- m_notice(sender, msg)
64- m_join(sender, chan)
65- m_part(sender, chan, msg)
66- m_quit(sender, msg)
67- m_nick(sender, nick)
68- m_kick(sender, chan, name, msg)
69- m_kicked(sender, chan, msg)
70- m_topic(sender, topic: str | None)
71- m_chantopic(sender, chan, topic: str | None)
72- m_mode(sender, modes)
73- m_chanmode(sender, chan, modes)
74- m_names(sender, chan, names)
75- m_endnames(sender, chan)
76- m_error(sender, msg)
77- m_client(msg)
78- m_server(sender, msg)
79
80Quasiconstants
81==============
82
83self_pipe_rd: int
84self_pipe_wr: int
85
86Global state
87============
88
89cur_buf: buf
90scr_height: int
91scr_width: int
92mono_last: float
93mono_offset: float
94out_buf: bytearray
95kbd_accum: bytearray
96kbd_state: function
97
98Collections
99===========
100
101commands: (name: str) => function
102buffers: non-empty list of buf
103buffer_index: (name: str, parent_name: str) => buf
104opening_conns: (fileno: int) => conn
105open_conns: (fileno: int) => conn
106network_conns: (network: str) => conn : all enabled networks, whether TCP alive or not
107schedule: min-heap of (time: float) => thunk
108
109Functions
110=========
111
112Excluding record constructors, accessors and basic mutators.
113
114Startup only:
115command(name: str, min_args=0: int, max_args=None: int | None, extended_arg=False: bool)(function) -> function
116check_command_dicts(keymap)
117make_casemapper(int) -> function of (str -> casemapped str)
118
119Boring:
120set_nonblock
121
122Pure functions:
123format_time(time_tuple) -> str
124is_ctrl(chr) -> bool
125ctrl(chr) -> chr
126is_meta(chr) -> bool
127meta(chr) -> chr
128variant_name(val) -> str
129variant_args(val) -> list
130matcher(vtype, cases: iterable of (constructor, receiver: function of (*args -> x))) -> function of (val: vtype -> x)
131sequence(*thunks) -> thunk
132flatten(iterable of iterable) -> iterable
133char_range(pair) -> str
134partition(list, pred) -> (left: list, right: list)
135split_pair(str, sep=' ': str) -> [str, str]
136make_encoder(function of chr -> str) -> function of (str -> str)
137asciify(str) -> str
138fs_encode(str) -> str
139casemap_ascii(str) -> str
140clip(min: comparable, max: comparable, comparable) -> comparable
141clip_to(list, int) -> int
142get_clipped(list, int) -> element of list
143clip_str(str, width: int) -> str
144pad_or_clip_str(str, width: int, pad=' ': chr) -> str
145wrap(line, width, indent=0) -> list of str
146is_digit(chr) -> bool
147parse_address(addr) -> (host: str, port: int) / ValueError
148format_address((host: str, port: int)) -> str
149int_of_bytes(str) -> int
150heap_peek(heap: list) -> (key, value) / IndexError
151safe_filename(name) -> bool
152config_lines(text) -> non-empty list of non-empty str | None
153format_buf_msg(val: message) -> str
154render_lines(lines: list of str, width: int, start: int, row_limit: int) -> (list of list, int)
155build_msg(prefix, cmd, params) -> str
156max_param_len(cmd, prefix=None) -> int
157parse_msg(msg) -> (prefix: str | None, cmd: str, params: list of str) / ProtocolError
158is_chan(str) -> bool
159valid_chan(str) -> bool
160valid_nick(str) -> bool
161valid_password(str) -> bool
162conn_nick_lc(conn) -> casemapped str
163sender_nick(str) -> str
164arg2
165arg3
166empty2
167lterr / TypeError
168format_log_msg(val: message except (m_chantopic | m_mode | m_client)) -> str
169
170Pure I/O:
171write_all(blocking fd, str|bytearray) / EnvironmentError
172read_all(nonblocking fd) -> str / EOFError, EnvironmentError : may return empty
173
174Pure drawing:
175buf_draw(buf)
176prompt_draw
177draw_status(y: int)
178buflist_draw
179buflist_vline_draw
180place_cursor
181refresh_if_needed
182
183"Queries":
184find_buf(buf) -> int : find buf's index in buffers list
185#buf_network(buf) -> str
186buf_conn(buf) -> conn / CommandError
187buf_registered_conn(buf) -> conn / CommandError
188get_config(key, paths=(()), default=None) -> str | default
189
190Side effects on data:
191write_out(str) : stores for write to terminal
192flush_out : sends full terminal output buffer
193variant(vtype, name: str, nargs: int) -> constructor: function of (*args -> (tag, args))
194rand_int(int) -> int
195heap_insert(heap: list, key: comparable, value)
196heap_extract(heap: list) -> (key, value) / IndexError
197run_command(line: str) -> * / CommandError
198buf_log_msg(buf, m: message)
199buf_privmsg(buf, msg: str) : buf_parent ; buf_registered_conn ; conn_privmsg / CommandError
200check_buf_at_end : buf_set_at_end(cur_buf) | buf_clr_at_end(cur_buf)
201is_child_of(buf) -> function of (buf -> bool)
202sort_buffers : sorts buffers & generates buffer_index
203get_buf(name, parent_name) -> buf : buffer_index lookup but creates if not found
204close_buf(buf)
205prompt_insert(chr)
206prompt_delete
207prompt_backspace
208prompt_submit
209info(msg: str, buf=None) : buf_log_msg to buf or buffers[0]
210error(msg_or_exc: str | Exception, buf=None) : buf_log_msg to buf or buffers[0]
211kaccum(str)
212kaccept(str)
213ktrans(kbd_state)
214ks_start(chr)
215ks_cx(chr)
216ks_esc(chr)
217ks_cseq(chr)
218ks_cs_intermed(chr)
219conn_run_in(conn, seconds: float, method: function of (conn), run_if_down=False) : run_in
220conn_log_msg(conn, venue: casemapped str | None, m: message) : get_buf ; buf_log_msg ; file_log_msg
221conn_info(conn, str) : uses conn_log_msg
222conn_error(conn, str) : uses conn_log_msg
223conn_start(conn) : starts connecting; bumps count; rotates addrs; adds to opening_conns and network_conns
224conn_write(conn, str) : stores for nonblocking write by main loop
225conn_send(conn, cmd: str, params: list of str, prefix=None: str) : build_msg ;conn_write (TODO check msg well-formedness)
226conn_handle_connected(conn) : if successful, moves c from opening_conns to open_conns & sends login
227conn_close(conn) : shuts down and removes from open_conns
228conn_handle_data(conn, data: str) : does input buffering; extracts messages and calls...
229conn_handle_msg(conn, msg: str) : mega-function for handling IRC commands
230conn_join(conn, chan: str, key=None) : conn_info ; conn_send
231conn_privmsg(conn, target: str, msg: str) : conn_log_msg ; conn_send
232conn_ping(conn)
233conn_timeout(conn)
234conn_reg_timeout(conn)
235file_log_msg(network: file-safe str, venue: casemapped str | None, m: message)
236handle_resize
237mono_time -> float
238run_in(seconds, thunk)
239
240Slash commands:
241quit_cmd
242connect_cmd
243disconnect_cmd
244join_cmd
245kick_cmd
246mode_cmd
247nick_cmd
248part_cmd
249send_cmd
250
251Lifecycle:
252main
253crash_handler
254
255MVP:
256finish commands
257 close/close-net debug
258prefix case sensitivity in conn_handle_msg?
259
260TODO:
261nick fallback
262buflist vscroll
263modes
264date changes
265prompt history, kill ring
266tab completion (but how to focus buf/prompt?)
267username, realname
268logging
269bold nicks (generally: formatted wrap)
270search in scrollback
271channel key (config, persist across reconnect)
272buffer cleanup by category
273help
274scripting
275self-ping to find user@host to calc max privmsg length
276Proliferation of casemapping is bound to be buggy.
277Recognize WHOIS/WHOWAS/LIST responses
278bracketed paste
279
280Possible cleanups:
281more use of lambda/sequence for trivial functions
282rename buf* to wind* to match manual's terminology (nobody but emacs uses "buffer" to mean "window"...)
283move cur_buf global to a buflist attribute
284use the new scheduler for schedule_*; use delayed redraw to perform well under message floods