+
+void _terminate_session(void) {
+ slrp_highest();
+ terminate_session();
+}
+
+HashList *GetWholistHash(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+ HashList *List;
+ char buf[SIZ];
+ time_t now;
+
+ serv_puts("TIME");
+ serv_getln(buf, sizeof buf);
+ if (buf[0] == '2') {
+ now = extract_long(&buf[4], 0);
+ }
+ else {
+ now = time(NULL);
+ }
+
+ List = NewHash(1, NULL);
+ GetWholistSection(List, now);
+ return List;
+}
+
+
+void DeleteWholistHash(HashList **KillMe)
+{
+ DeleteHash(KillMe);
+}
+
+void tmplput_who_username(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->UserName, 0);
+}
+
+void tmplput_who_room(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->Room, 0);
+}
+
+void tmplput_who_host(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->Host, 0);
+}
+
+void tmplput_who_realroom(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->RealRoom, 0);
+}
+int conditional_who_realroom(WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ return StrLength(User->RealRoom) > 0;
+}
+
+void tmplput_who_realhost(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->RealHost, 0);
+}
+
+void tmplput_who_lastactive(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendPrintf(Target, "%d", User->LastActive);
+}
+
+void tmplput_who_idlesince(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendPrintf(Target, "%d", User->IdleSince);
+}
+
+void tmplput_who_session(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendPrintf(Target, "%d", User->Session);
+}
+
+int conditional_who_idle(WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ return User->Idle;
+}
+
+int conditional_who_nsessions(WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ return User->SessionCount;
+}
+
+void tmplput_who_nsessions(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendPrintf(Target, "%d", User->SessionCount);
+}
+
+int conditional_who_isme(WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ return (User->Session == WC->ctdl_pid);
+}
+
+void
+InitModule_WHO
+(void)
+{
+ WebcitAddUrlHandler(HKEY("terminate_session"), _terminate_session, 0);
+ WebcitAddUrlHandler(HKEY("edit_me"), edit_me, 0);
+
+ RegisterIterator("WHOLIST", 0, NULL, GetWholistHash, NULL, DeleteWholistHash, CTX_WHO, CTX_NONE);
+
+ RegisterNamespace("WHO:NAME", 0, 1, tmplput_who_username, CTX_WHO);
+ RegisterNamespace("WHO:ROOM", 0, 1, tmplput_who_room, CTX_WHO);
+ RegisterNamespace("WHO:HOST", 0, 1, tmplput_who_host, CTX_WHO);
+ RegisterNamespace("WHO:REALROOM", 0, 1, tmplput_who_realroom, CTX_WHO);
+ RegisterNamespace("WHO:REALHOST", 0, 1, tmplput_who_realhost, CTX_WHO);
+ RegisterNamespace("WHO:LASTACTIVE", 0, 1, tmplput_who_lastactive, CTX_WHO);
+ RegisterNamespace("WHO:IDLESINCE", 0, 1, tmplput_who_idlesince, CTX_WHO);
+ RegisterNamespace("WHO:SESSION", 0, 1, tmplput_who_session, CTX_WHO);
+ RegisterNamespace("WHO:NSESSIONS", 0, 1, tmplput_who_nsessions, CTX_WHO);
+ RegisterNamespace("WHO:NSESSIONS", 0, 1, tmplput_who_nsessions, CTX_WHO);
+
+ RegisterConditional(HKEY("WHO:IDLE"), 1, conditional_who_idle, CTX_WHO);
+ RegisterConditional(HKEY("WHO:NSESSIONS"), 1, conditional_who_nsessions, CTX_WHO);
+ RegisterConditional(HKEY("WHO:ISME"), 1, conditional_who_isme, CTX_WHO);
+ RegisterConditional(HKEY("WHO:REALROOM"), 1, conditional_who_realroom, CTX_WHO);
+}