From 7de285524a22768b00c82601faae9d5b96a7db6e Mon Sep 17 00:00:00 2001 From: tali Date: Tue, 30 Jan 2024 21:30:54 -0500 Subject: [PATCH] add AWAY command --- lib/server/connection.ml | 24 ++++++++++++++++++++---- lib/server/router_types.ml | 1 + lib/server/user.ml | 3 +++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/lib/server/connection.ml b/lib/server/connection.ml index c2fb85f..1cb3227 100644 --- a/lib/server/connection.ml +++ b/lib/server/connection.ml @@ -49,7 +49,7 @@ let reply t (num, params) = | None -> "*" in let always_trailing = match num with - | "332" | "353" -> true + | "301" | "332" | "353" -> true | _ -> false in Outbox.send t.outbox @@ -57,6 +57,7 @@ let reply t (num, params) = ~prefix ~always_trailing) let tryagain cmd = "263", [cmd; "Please wait a while and try again."] +let away nick text = "301", [nick; text] let nosuchnick tgt = "401", [tgt; "No such nick/channel"] let nosuchchannel tgt = "403", [tgt; "No such channel"] let cannotsendtochan tgt = "404", [tgt; "Cannot send to channel"] @@ -291,8 +292,9 @@ let on_privmsg_chan from chan = Ok (Chan.name chan, [`to_chan chan]) let on_privmsg_user _from user = - (* TODO: check if user is away *) - Ok (User.nick user, [`to_user user]) + match User.away user with + | Some text -> Error (away (User.nick user) text) + | None -> Ok (User.nick user, [`to_user user]) let on_msg_privmsg t tgt txt = let* me = require_registered t in @@ -309,6 +311,19 @@ let on_msg_privmsg t tgt txt = Router.relay msg ~from:me tgts; Ok () +let on_msg_away t status = + let* me = require_registered t in + if status <> User.away me then + begin + let rpl = match status with + | None -> "305", ["You are no longer marked as being away"] + | Some _ -> "306", ["You have been marked as being away"] + in + User.set_away me status; + reply t rpl + end; + Ok () + let list_names t me chan = let is_secret = Mode.Set.mem `s (Chan.mode chan) in let is_invisible user = Mode.Set.mem `i (User.mode user) in @@ -631,7 +646,7 @@ let on_msg_user t username realname = (* message parsing *) let concat_args = function - | [] -> None + | [] | [""] -> None | xs -> Some (String.concat " " xs) let dispatch t = function @@ -650,6 +665,7 @@ let dispatch t = function | "PART", tgt :: reason when tgt <> "" -> on_msg_part t tgt (concat_args reason) | "KICK", chn :: tgt :: comment when chn <> "" && tgt <> "" -> on_msg_kick t chn tgt (concat_args comment) + | "AWAY", args -> on_msg_away t (concat_args args) | "MODE", tgt :: args when tgt <> "" -> on_msg_mode t tgt args | ("USER" | "JOIN" | "NAMES" | "PART" | "KICK" | "MODE") as cmd, _ -> Error (needmoreparams cmd) diff --git a/lib/server/router_types.ml b/lib/server/router_types.ml index 255222f..6f230aa 100644 --- a/lib/server/router_types.ml +++ b/lib/server/router_types.ml @@ -9,6 +9,7 @@ type user = { mutable nick : name; mutable nick_key : string_ci; mutable user_mode : Mode.Set.t; + mutable away : string option; mutable membership : membership Dllist.t; } diff --git a/lib/server/user.ml b/lib/server/user.ml index 42f4ee8..0676a00 100644 --- a/lib/server/user.ml +++ b/lib/server/user.ml @@ -10,6 +10,7 @@ let make nick ~userinfo ~outbox = nick; nick_key = string_ci nick; user_mode = Irc.Mode.Set.empty; + away = None; membership = Dllist.create (); } @@ -17,6 +18,8 @@ let outbox t = t.outbox let nick t = t.nick let mode t = t.user_mode let set_mode t new_mode = t.user_mode <- new_mode +let away t = t.away +let set_away t status = t.away <- status let set_nick t new_nick = begin