}
-int GetWholistSection(HashList *List, time_t now)
+int GetWholistSection(HashList *List, time_t now, StrBuf *Buf)
{
- StrBuf *Buf, *XBuf;
- struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */
+ wcsession *WCC = WC;
UserStateStruct *User, *OldUser;
void *VOldUser;
size_t BufLen;
- char buf[SIZ];
+ const char *Pos;
serv_puts("RWHO");
- serv_getln(buf, sizeof buf);
- if (buf[0] == '1') {
- Buf = NewStrBuf();
- XBuf = NewStrBuf();
- while (BufLen = StrBuf_ServGetln(Buf), strcmp(ChrPtr(Buf), "000")) {
+ StrBuf_ServGetlnBuffered(Buf);
+ if (GetServerStatus(Buf, NULL) == 1) {
+ while (BufLen = StrBuf_ServGetlnBuffered(Buf), strcmp(ChrPtr(Buf), "000")) {
if (BufLen <= 0)
continue;
+ Pos = NULL;
User = (UserStateStruct*) malloc(sizeof(UserStateStruct));
- User->Session = StrBufExtract_int(Buf, 0, '|');
+ User->Session = StrBufExtractNext_int(Buf, &Pos, '|');
+
+ User->UserName = NewStrBufPlain(NULL, BufLen);
+ StrBufExtract_NextToken(User->UserName, Buf, &Pos, '|');
+
+ User->Room = NewStrBufPlain(NULL, BufLen);
+ StrBufExtract_NextToken(User->Room, Buf, &Pos, '|');
- StrBufExtract_token(XBuf, Buf, 1, '|');
- User->UserName = NewStrBufDup(XBuf);
+ User->Host = NewStrBufPlain(NULL, BufLen);
+ StrBufExtract_NextToken(User->Host, Buf, &Pos, '|');
- StrBufExtract_token(XBuf, Buf, 2, '|');
- User->Room = NewStrBufDup(XBuf);
+ StrBufSkip_NTokenS(Buf, &Pos, '|', 1);
- StrBufExtract_token(XBuf, Buf, 3, '|');
- User->Host = NewStrBufDup(XBuf);
+ User->LastActive = StrBufExtractNext_long(Buf, &Pos, '|');
+ StrBufSkip_NTokenS(Buf, &Pos, '|', 3);
- StrBufExtract_token(XBuf, Buf, 9, '|');
- User->RealRoom = NewStrBufDup(XBuf);
+ User->RealRoom = NewStrBufPlain(NULL, BufLen);
+ StrBufExtract_NextToken(User->RealRoom, Buf, &Pos, '|');
- StrBufExtract_token(XBuf, Buf, 10, '|');
- User->RealHost = NewStrBufDup(XBuf);
+ User->RealHost = NewStrBufPlain(NULL, BufLen);
+ StrBufExtract_NextToken(User->RealHost, Buf, &Pos, '|');
- User->LastActive = StrBufExtract_long(Buf, 5, '|');
User->Idle = (now - User->LastActive) > 900L;
User->IdleSince = (now - User->LastActive) / 60;
User->SessionCount = 1;
}
SortByPayload(List, CompareUserStruct);
- FreeStrBuf(&XBuf);
FreeStrBuf(&Buf);
return 1;
}
- else
+ else {
+ FreeStrBuf(&Buf);
return 0;
+ }
}
/*
serv_printf("TERM %s", bstr("which_session"));
serv_getln(buf, sizeof buf);
- ///who();
url_do_template();
}
terminate_session();
}
-HashList *GetWholistHash(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+HashList *GetWholistHash(StrBuf *Target, WCTemplputParams *TP)
+
{
+ StrBuf *Buf;
HashList *List;
- char buf[SIZ];
time_t now;
+ Buf = NewStrBuf();
+
serv_puts("TIME");
- serv_getln(buf, sizeof buf);
- if (buf[0] == '2') {
- now = extract_long(&buf[4], 0);
+ StrBuf_ServGetlnBuffered(Buf);
+ if (GetServerStatus(Buf, NULL) == 2) {
+ const char *pos = ChrPtr(Buf) + 4;
+ now = StrBufExtractNext_long(Buf, &pos, '|');
}
else {
now = time(NULL);
}
List = NewHash(1, NULL);
- GetWholistSection(List, now);
+ GetWholistSection(List, now, Buf);
+ FreeStrBuf(&Buf);
return List;
}
DeleteHash(KillMe);
}
-void tmplput_who_username(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+void tmplput_who_username(StrBuf *Target, WCTemplputParams *TP)
{
- UserStateStruct *User = (UserStateStruct*) vContext;
- StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->UserName, 0);
+ UserStateStruct *User = (UserStateStruct*) CTX;
+ StrBufAppendTemplate(Target, TP, User->UserName, 0);
}
-void tmplput_who_room(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+void tmplput_who_room(StrBuf *Target, WCTemplputParams *TP)
{
- UserStateStruct *User = (UserStateStruct*) vContext;
- StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->Room, 0);
+ UserStateStruct *User = (UserStateStruct*) CTX;
+ StrBufAppendTemplate(Target, TP, User->Room, 0);
}
-void tmplput_who_host(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+void tmplput_who_host(StrBuf *Target, WCTemplputParams *TP)
{
- UserStateStruct *User = (UserStateStruct*) vContext;
- StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->Host, 0);
+ UserStateStruct *User = (UserStateStruct*) CTX;
+ StrBufAppendTemplate(Target, TP, User->Host, 0);
}
-void tmplput_who_realroom(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+void tmplput_who_realroom(StrBuf *Target, WCTemplputParams *TP)
{
- UserStateStruct *User = (UserStateStruct*) vContext;
- StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->RealRoom, 0);
+ UserStateStruct *User = (UserStateStruct*) CTX;
+ StrBufAppendTemplate(Target, TP, User->RealRoom, 0);
}
-int conditional_who_realroom(WCTemplateToken *Tokens, void *vContext, int ContextType)
+int conditional_who_realroom(StrBuf *Target, WCTemplputParams *TP)
{
- UserStateStruct *User = (UserStateStruct*) vContext;
+ UserStateStruct *User = (UserStateStruct*) CTX;
return StrLength(User->RealRoom) > 0;
}
-void tmplput_who_realhost(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+void tmplput_who_realhost(StrBuf *Target, WCTemplputParams *TP)
{
- UserStateStruct *User = (UserStateStruct*) vContext;
- StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->RealHost, 0);
+ UserStateStruct *User = (UserStateStruct*) CTX;
+ StrBufAppendTemplate(Target, TP, User->RealHost, 0);
}
-void tmplput_who_lastactive(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+void tmplput_who_lastactive(StrBuf *Target, WCTemplputParams *TP)
{
- UserStateStruct *User = (UserStateStruct*) vContext;
+ UserStateStruct *User = (UserStateStruct*) CTX;
StrBufAppendPrintf(Target, "%d", User->LastActive);
}
-void tmplput_who_idlesince(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+void tmplput_who_idlesince(StrBuf *Target, WCTemplputParams *TP)
{
- UserStateStruct *User = (UserStateStruct*) vContext;
+ UserStateStruct *User = (UserStateStruct*) CTX;
StrBufAppendPrintf(Target, "%d", User->IdleSince);
}
-void tmplput_who_session(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+void tmplput_who_session(StrBuf *Target, WCTemplputParams *TP)
{
- UserStateStruct *User = (UserStateStruct*) vContext;
+ UserStateStruct *User = (UserStateStruct*) CTX;
StrBufAppendPrintf(Target, "%d", User->Session);
}
-int conditional_who_idle(WCTemplateToken *Tokens, void *vContext, int ContextType)
+int conditional_who_idle(StrBuf *Target, WCTemplputParams *TP)
{
- UserStateStruct *User = (UserStateStruct*) vContext;
+ UserStateStruct *User = (UserStateStruct*) CTX;
return User->Idle;
}
-int conditional_who_nsessions(WCTemplateToken *Tokens, void *vContext, int ContextType)
+int conditional_who_nsessions(StrBuf *Target, WCTemplputParams *TP)
{
- UserStateStruct *User = (UserStateStruct*) vContext;
+ UserStateStruct *User = (UserStateStruct*) CTX;
return User->SessionCount;
}
-void tmplput_who_nsessions(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+void tmplput_who_nsessions(StrBuf *Target, WCTemplputParams *TP)
{
- UserStateStruct *User = (UserStateStruct*) vContext;
+ UserStateStruct *User = (UserStateStruct*) CTX;
StrBufAppendPrintf(Target, "%d", User->SessionCount);
}
-int conditional_who_isme(WCTemplateToken *Tokens, void *vContext, int ContextType)
+int conditional_who_isme(StrBuf *Target, WCTemplputParams *TP)
{
- UserStateStruct *User = (UserStateStruct*) vContext;
+ UserStateStruct *User = (UserStateStruct*) CTX;
return (User->Session == WC->ctdl_pid);
}
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);
+ RegisterIterator("WHOLIST", 0, NULL, GetWholistHash, NULL, DeleteWholistHash, CTX_WHO, CTX_NONE, IT_NOFLAG);
RegisterNamespace("WHO:NAME", 0, 1, tmplput_who_username, CTX_WHO);
RegisterNamespace("WHO:ROOM", 0, 1, tmplput_who_room, CTX_WHO);