+int CompareUserStruct(const void *VUser1, const void *VUser2)
+{
+ const UserStateStruct *User1 = (UserStateStruct*) GetSearchPayload(VUser1);
+ const UserStateStruct *User2 = (UserStateStruct*) GetSearchPayload(VUser2);
+
+ if (User1->Idle != User2->Idle)
+ return User1->Idle > User2->Idle;
+ return strcasecmp(ChrPtr(User1->UserName),
+ ChrPtr(User2->UserName));
+}
+
+
+int GetWholistSection(HashList *List, time_t now, StrBuf *Buf, const char *FilterName, long FNLen)
+{
+ wcsession *WCC = WC;
+ UserStateStruct *User, *OldUser;
+ void *VOldUser;
+ size_t BufLen;
+ const char *Pos;
+
+ serv_puts("RWHO");
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, NULL) == 1) {
+ while (BufLen = StrBuf_ServGetln(Buf),
+ ((BufLen >= 0) &&
+ ((BufLen != 3) || strcmp(ChrPtr(Buf), "000"))))
+ {
+ if (BufLen <= 0)
+ continue;
+ Pos = NULL;
+ User = (UserStateStruct*) malloc(sizeof(UserStateStruct));
+ 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, '|');
+
+ User->Host = NewStrBufPlain(NULL, BufLen);
+ StrBufExtract_NextToken(User->Host, Buf, &Pos, '|');
+
+ User->UserAgent = NewStrBufPlain(NULL, BufLen);
+ StrBufExtract_NextToken(User->UserAgent, Buf, &Pos, '|');
+
+ User->LastActive = StrBufExtractNext_long(Buf, &Pos, '|');
+ StrBufSkip_NTokenS(Buf, &Pos, '|', 3);
+
+ User->RealRoom = NewStrBufPlain(NULL, BufLen);
+ StrBufExtract_NextToken(User->RealRoom, Buf, &Pos, '|');
+
+ User->RealHost = NewStrBufPlain(NULL, BufLen);
+ StrBufExtract_NextToken(User->RealHost, Buf, &Pos, '|');
+
+ User->Idle = (now - User->LastActive) > 900L;
+ User->IdleSince = (now - User->LastActive) / 60;
+ User->SessionCount = 1;
+
+ if (FilterName == NULL) {
+ if (GetHash(List,
+ SKEY(User->UserName),
+ &VOldUser)) {
+ OldUser = VOldUser;
+ OldUser->SessionCount++;
+ if (!User->Idle) {
+ if (User->Session == WCC->ctdl_pid)
+ OldUser->Session = User->Session;
+
+ OldUser->Idle = User->Idle;
+ OldUser->LastActive = User->LastActive;
+ }
+ DestroyUserStruct(User);
+ }
+ else
+ Put(List,
+ SKEY(User->UserName),
+ User, DestroyUserStruct);
+ }
+ else {
+ if (strcmp(FilterName, ChrPtr(User->UserName)) == 0)
+ {
+ Put(List,
+ SKEY(User->UserName),
+ User, DestroyUserStruct);
+ }
+ else
+ {
+ DestroyUserStruct(User);
+ }
+ }
+ }
+ if (FilterName == NULL)
+ SortByPayload(List, CompareUserStruct);
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}