case SILC_COMMAND_UMODE:
{
SilcUInt32 mode;
+ char *reason;
if (!success)
return;
printformat_module("fe-common/silc", server, NULL,
MSGLEVEL_CRAP, SILCTXT_ROUTER_OPER);
+ if ((mode & SILC_UMODE_GONE) != (server->umode & SILC_UMODE_GONE)) {
+ if (mode & SILC_UMODE_GONE) {
+ if ((server->away_reason != NULL) && (server->away_reason[0] != '\0'))
+ reason = g_strdup(server->away_reason);
+ else
+ reason = g_strdup("away");
+ } else
+ reason = g_strdup("");
+
+ silc_set_away(reason, server);
+
+ g_free(reason);
+ }
+
server->umode = mode;
signal_emit("user mode changed", 2, server, NULL);
}
/* AWAY local command. Sends UMODE command that sets the SILC_UMODE_GONE
flag. */
-static void command_away(const char *data, SILC_SERVER_REC *server,
- WI_ITEM_REC *item)
+bool silc_set_away(const char *reason, SILC_SERVER_REC *server)
{
bool set;
-
- CMD_SILC_SERVER(server);
-
+
if (!IS_SILC_SERVER(server) || !server->connected)
- cmd_return_error(CMDERR_NOT_CONNECTED);
-
- if (*data == '\0') {
+ return FALSE;
+
+ if (*reason == '\0') {
/* Remove any possible away message */
silc_client_set_away_message(silc_client, server->conn, NULL);
set = FALSE;
SILCTXT_UNSET_AWAY);
} else {
/* Set the away message */
- silc_client_set_away_message(silc_client, server->conn, (char *)data);
+ silc_client_set_away_message(silc_client, server->conn, (char *)reason);
set = TRUE;
printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP,
- SILCTXT_SET_AWAY, data);
+ SILCTXT_SET_AWAY, reason);
}
server->usermode_away = set;
g_free_and_null(server->away_reason);
if (set)
- server->away_reason = g_strdup((char *)data);
+ server->away_reason = g_strdup((char *)reason);
signal_emit("away mode changed", 1, server);
- silc_command_exec(server, "UMODE", set ? "+g" : "-g");
+ return set;
+}
+
+static void command_away(const char *data, SILC_SERVER_REC *server,
+ WI_ITEM_REC *item)
+{
+ CMD_SILC_SERVER(server);
+
+ if (!IS_SILC_SERVER(server) || !server->connected)
+ cmd_return_error(CMDERR_NOT_CONNECTED);
+
+ g_free_and_null(server->away_reason);
+ if ((data) && (*data != '\0'))
+ server->away_reason = g_strdup(data);
+
+ silc_command_exec(server, "UMODE",
+ (server->away_reason != NULL) ? "+g" : "-g");
}
typedef struct {