PRIVMSG and NOTICE working between users

This commit is contained in:
Neale Pickett 2008-03-07 12:00:40 -07:00
parent c89eeb3160
commit 8cefe61976
6 changed files with 52 additions and 5 deletions

View File

@ -9,3 +9,11 @@ let lookup name =
let create name = let create name =
{name = name} {name = name}
let is_channel_name name =
match name.[0] with
| '#' | '&' | '!' | '+' ->
true
| _ ->
false

View File

@ -2,5 +2,7 @@ type t
val modes : string val modes : string
val create : string -> t
val lookup : string -> t val lookup : string -> t
val create : string -> t
val is_channel_name : string -> bool

View File

@ -18,9 +18,15 @@ let dbg msg a = prerr_endline msg; a
let by_nick = Hashtbl.create 25 let by_nick = Hashtbl.create 25
let lookup nick =
Hashtbl.find by_nick nick
let error num args text = let error num args text =
Error (Command.create (Some !(Irc.name)) num args (Some text)) Error (Command.create (Some !(Irc.name)) num args (Some text))
let uhost cli =
(!(cli.nick) ^ "!" ^ cli.username ^ "@" ^ (Iobuf.addr cli.iobuf))
let close cli = let close cli =
Iobuf.close cli.iobuf Iobuf.close cli.iobuf
@ -67,10 +73,22 @@ let handle_command cli iobuf cmd =
() ()
| (None, "KICK", [channels; users], comment) -> | (None, "KICK", [channels; users], comment) ->
() ()
| (None, "PRIVMSG", [target], Some text) -> | (None, ("PRIVMSG" as command), [target], Some text)
() | (None, ("NOTICE" as command), [target], Some text) ->
| (None, "NOTICE", [target], Some text) -> if Channel.is_channel_name target then
() reply cli "403" ~args:[target] "No such channel"
else
begin
try
let peer = lookup target in
write peer (Command.create
(Some (uhost cli))
command
[target]
(Some text))
with Not_found ->
reply cli "401" ~args:[target] "No such nick/channel"
end
| (None, "MOTD", [], None) -> | (None, "MOTD", [], None) ->
reply cli "422" "MOTD File is missing" reply cli "422" "MOTD File is missing"
| (None, "LUSERS", [], None) -> | (None, "LUSERS", [], None) ->

View File

@ -8,6 +8,7 @@ type t = {ues: Unixqueue.event_system;
unsent: string ref; unsent: string ref;
ibuf: string; ibuf: string;
ibuf_len: int ref; ibuf_len: int ref;
addr: string;
command_handler: (t -> Command.t -> unit) ref; command_handler: (t -> Command.t -> unit) ref;
close_handler: (unit -> unit) ref} close_handler: (unit -> unit) ref}
@ -17,6 +18,8 @@ let obuf_max = 4096
let by_file_descr = Hashtbl.create 25 let by_file_descr = Hashtbl.create 25
let addr iobuf = iobuf.addr
let write iobuf cmd = let write iobuf cmd =
let was_empty = Queue.is_empty iobuf.outq in let was_empty = Queue.is_empty iobuf.outq in
Queue.add cmd iobuf.outq; Queue.add cmd iobuf.outq;
@ -107,6 +110,13 @@ let bind ues grp fd command_handler close_handler =
let (outq, unsent, ibuf, ibuf_len) = let (outq, unsent, ibuf, ibuf_len) =
(Queue.create (), ref "", String.create ibuf_max, ref 0) (Queue.create (), ref "", String.create ibuf_max, ref 0)
in in
let addr =
match Unix.getpeername fd with
| Unix.ADDR_UNIX s ->
"UDS"
| Unix.ADDR_INET (addr, port) ->
Unix.string_of_inet_addr addr
in
let iobuf = {ues = ues; let iobuf = {ues = ues;
grp = grp; grp = grp;
fd = fd; fd = fd;
@ -114,6 +124,7 @@ let bind ues grp fd command_handler close_handler =
unsent = unsent; unsent = unsent;
ibuf = ibuf; ibuf = ibuf;
ibuf_len = ibuf_len; ibuf_len = ibuf_len;
addr = addr;
command_handler = ref command_handler; command_handler = ref command_handler;
close_handler = ref close_handler} close_handler = ref close_handler}
in in

View File

@ -1,5 +1,7 @@
type t type t
val addr : t -> string
val write : t -> Command.t -> unit val write : t -> Command.t -> unit
val bind : Unixqueue.event_system -> Unixqueue.group -> Unix.file_descr -> (t -> Command.t -> unit) -> (unit -> unit) -> unit val bind : Unixqueue.event_system -> Unixqueue.group -> Unix.file_descr -> (t -> Command.t -> unit) -> (unit -> unit) -> unit
val rebind: t -> (t -> Command.t -> unit) -> (unit -> unit) -> unit val rebind: t -> (t -> Command.t -> unit) -> (unit -> unit) -> unit

View File

@ -69,6 +69,12 @@ let regression_tests =
Recv ":testserver.test 303 nick :nick\r\n"; Recv ":testserver.test 303 nick :nick\r\n";
Send "ISON otherguy thirdguy\r\n"; Send "ISON otherguy thirdguy\r\n";
Recv ":testserver.test 303 nick :\r\n"; Recv ":testserver.test 303 nick :\r\n";
Send "PRIVMSG nick :hello\r\n";
Recv ":nick!nick@UDS PRIVMSG nick :hello\r\n";
Send "NOTICE nick :hello\r\n";
Recv ":nick!nick@UDS NOTICE nick :hello\r\n";
Send "PRIVMSG otherguy :hello\r\n";
Recv ":testserver.test 401 nick otherguy :No such nick/channel\r\n";
])); ]));
"Second connection" >:: "Second connection" >::