mirror of https://github.com/nealey/irc-bot
Start at using records instead of objects
This commit is contained in:
parent
9f494e9cca
commit
4ff349018d
|
@ -0,0 +1,58 @@
|
|||
let ibuf_max = 4096
|
||||
let max_outq = 50
|
||||
let max_unsent = 4096
|
||||
|
||||
type client = {outq: Queue.t;
|
||||
unsent: string ref;
|
||||
ibuf: String;
|
||||
ibuf_len: int ref;
|
||||
out_ready: unit -> unit}
|
||||
|
||||
|
||||
let new_client g fd =
|
||||
let cli = {outq = Queue.create ();
|
||||
unsent = ref "";
|
||||
ibuf = String.create ibuf_max;
|
||||
ibuf_len = ref 0;
|
||||
out_ready = fun () ->
|
||||
Unixqueue.add_resource g (Unixqueue.Wait_out fd, -.1.0)}
|
||||
in
|
||||
Unixqueue.add_resource g (Unixqueue.Wait_in fd, -.1.0);
|
||||
Unixqueue.add_handler g (handle_client_event cli);
|
||||
cli
|
||||
|
||||
|
||||
let handle_client_event cli ues esys e =
|
||||
match e with
|
||||
| Input_arrived (g, fd) ->
|
||||
let size = ibuf_max - !cli.ibuf_len in
|
||||
let len = Unix.read fd cli.ibuf !cli.ibuf_len size in
|
||||
if (len > 0) then
|
||||
begin
|
||||
cli.ibuf_len := !cli.ibuf_len + len;
|
||||
try
|
||||
split_client_input cli ues
|
||||
with Not_found ->
|
||||
if (!cli.ibuf_len = ibuf_max) then
|
||||
(* No newline found, and the buffer is full *)
|
||||
raise Buffer_overrun;
|
||||
end
|
||||
else
|
||||
begin
|
||||
|
||||
handle_close ();
|
||||
Unix.close fd;
|
||||
ues#clear g;
|
||||
end
|
||||
| Output_readiness (g, fd) ->
|
||||
print_endline "Output ready"
|
||||
| Out_of_band (g, fd) ->
|
||||
print_endline "Amy is hotttt"
|
||||
| Timeout (g, op) ->
|
||||
print_endline "Timeout!!!1!!1 ZOMG!"
|
||||
| Signal ->
|
||||
print_endline "Signal"
|
||||
| Extra exn ->
|
||||
print_endline "Extra"
|
||||
|
||||
|
Loading…
Reference in New Issue