$NetBSD: patch-ad,v 1.1 2004/03/29 11:05:45 wiz Exp $ --- src/fe-common/fe-icb.c.orig Sat Apr 27 22:56:18 2002 +++ src/fe-common/fe-icb.c @@ -18,6 +18,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include + #include "module.h" #include "module-formats.h" #include "signals.h" @@ -84,12 +86,67 @@ static void event_personal(ICB_SERVER_RE icb_split_free(args); } +static void idle_time(char *buf, size_t bufsize, time_t idle) +{ +#define MIN_LEN 60UL +#define HOUR_LEN 3600UL +#define DAY_LEN 86400UL +#define WEEK_LEN 604800UL + + if (idle >= WEEK_LEN) + snprintf(buf, bufsize, "%2dw%2dd", + (int)(idle/WEEK_LEN), (int)((idle%WEEK_LEN)/DAY_LEN)); + else if (idle >= DAY_LEN) + snprintf(buf, bufsize, "%2dd%2dh", + (int)(idle/DAY_LEN), (int)((idle%DAY_LEN)/HOUR_LEN)); + else if (idle >= HOUR_LEN) + snprintf(buf, bufsize, "%2dh%2dm", + (int)(idle/HOUR_LEN), (int)((idle%HOUR_LEN)/MIN_LEN)); + else if (idle >= MIN_LEN) + snprintf(buf, bufsize, "%2dm%2ds", + (int)(idle/MIN_LEN), (int)(idle%MIN_LEN)); + else + snprintf(buf, bufsize, " %2ds", (int)idle); +} + +static void cmdout_wl(ICB_SERVER_REC *server, char **args) +{ + struct tm *logintime; + char logbuf[20]; + char idlebuf[20]; + char line[255]; + time_t temptime; + + /* "wl" : In a who listing, a line of output listing a user. Has the following format: + + * Field 1: String indicating whether user is moderator or not. Usually "*" for + * moderator, and " " for not. + * Field 2: Nickname of user. + * Field 3: Number of seconds user has been idle. + * Field 4: Response Time. No longer in use. + * Field 5: Login Time. Unix time_t format. Seconds since Jan. 1, 1970 GMT. + * Field 6: Username of user. + * Field 7: Hostname of user. + * Field 8: Registration status. + */ + temptime = strtol(args[4], NULL, 10); + logintime = gmtime(&temptime); + strftime(logbuf, sizeof(logbuf), "%b %e %H:%M", logintime); + temptime = strtol(args[2], NULL, 10); + idle_time(idlebuf, sizeof(idlebuf), temptime); + + snprintf(line, sizeof(line), "*** %c%-14.14s %6.6s %12.12s %s@%s %s", + args[0][0] == ' '?' ':'*', args[1], idlebuf, logbuf, args[5], + args[6], args[7]); + printtext(server, NULL, MSGLEVEL_CRAP, line); +} + static void cmdout_default(ICB_SERVER_REC *server, char **args) { char *data; data = g_strjoinv(" ", args+1); - printtext(server, server->group->name, MSGLEVEL_CRAP, "%s", data); + printtext(server, NULL, MSGLEVEL_CRAP, "%s", data); g_free(data); } @@ -115,6 +172,7 @@ void fe_icb_init(void) signal_add("icb event beep", (SIGNAL_FUNC) event_beep); signal_add("icb event open", (SIGNAL_FUNC) event_open); signal_add("icb event personal", (SIGNAL_FUNC) event_personal); + signal_add("icb cmdout wl", (SIGNAL_FUNC) cmdout_wl); signal_add("default icb cmdout", (SIGNAL_FUNC) cmdout_default); signal_add("server add fill", (SIGNAL_FUNC) sig_server_add_fill); @@ -131,6 +189,7 @@ void fe_icb_deinit(void) signal_remove("icb event beep", (SIGNAL_FUNC) event_beep); signal_remove("icb event open", (SIGNAL_FUNC) event_open); signal_remove("icb event personal", (SIGNAL_FUNC) event_personal); + signal_remove("icb cmdout wl", (SIGNAL_FUNC) cmdout_wl); signal_remove("default icb cmdout", (SIGNAL_FUNC) cmdout_default); signal_remove("server add fill", (SIGNAL_FUNC) sig_server_add_fill);