X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Froomops.c;h=d63bfdd963cd1d1110e04c4b014e0ca618b8cde0;hb=b212124c4fe6aded9b574dfc50e866bb3fbbab48;hp=5b9840cc6b0f4c2a01447ff54ea2b303ea93fcc5;hpb=a29322d6a2e8145fe3b836bc3702c43a2895def8;p=citadel.git diff --git a/webcit/roomops.c b/webcit/roomops.c index 5b9840cc6..d63bfdd96 100644 --- a/webcit/roomops.c +++ b/webcit/roomops.c @@ -9,8 +9,6 @@ char floorlist[MAX_FLOORS][SIZ]; /* list of our floor names */ -char *viewdefs[9]; /* the different kinds of available views */ - /* See GetFloorListHash and GetRoomListHash for info on these. * Basically we pull LFLR/LKRA etc. and set up a room HashList with these keys. */ @@ -18,19 +16,37 @@ char *viewdefs[9]; /* the different kinds of available views */ void display_whok(void); int ConditionalHaveRoomeditRights(StrBuf *Target, WCTemplputParams *TP); + +char *viewdefs[VIEW_MAX]; /* the different kinds of available views */ + +ROOM_VIEWS exchangeable_views[VIEW_MAX][VIEW_MAX] = { /* the different kinds of available views for a view */ +{VIEW_BBS, VIEW_MAILBOX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX }, +{VIEW_BBS, VIEW_MAILBOX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX }, +{VIEW_MAX, VIEW_MAX, VIEW_ADDRESSBOOK, VIEW_CALENDAR, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX }, +{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_CALENDAR, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX /*VIEW_CALBRIEF*/, VIEW_MAX, VIEW_MAX }, +{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_TASKS, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, }, +{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_NOTES, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, }, +{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_WIKI, VIEW_MAX, VIEW_MAX, VIEW_MAX}, +{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_CALENDAR, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX/*VIEW_CALBRIEF*/, VIEW_MAX, VIEW_MAX}, +{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_JOURNAL, VIEW_MAX }, +{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_BLOG }, + }; +/* the brief calendar view is disabled: VIEW_CALBRIEF */ + /* * Initialize the viewdefs with localized strings */ void initialize_viewdefs(void) { - viewdefs[0] = _("Bulletin Board"); - viewdefs[1] = _("Mail Folder"); - viewdefs[2] = _("Address Book"); - viewdefs[3] = _("Calendar"); - viewdefs[4] = _("Task List"); - viewdefs[5] = _("Notes List"); - viewdefs[6] = _("Wiki"); - viewdefs[7] = _("Calendar List"); - viewdefs[8] = _("Journal"); + viewdefs[VIEW_BBS] = _("Bulletin Board"); + viewdefs[VIEW_MAILBOX] = _("Mail Folder"); + viewdefs[VIEW_ADDRESSBOOK] = _("Address Book"); + viewdefs[VIEW_CALENDAR] = _("Calendar"); + viewdefs[VIEW_TASKS] = _("Task List"); + viewdefs[VIEW_NOTES] = _("Notes List"); + viewdefs[VIEW_WIKI] = _("Wiki"); + viewdefs[VIEW_CALBRIEF] = _("Calendar List"); + viewdefs[VIEW_JOURNAL] = _("Journal"); + viewdefs[VIEW_BLOG] = _("Blog"); } /* @@ -232,168 +248,6 @@ void zapped_list(void) } -/* - * read this room's info file (set v to 1 for verbose mode) - */ -void readinfo(StrBuf *Target, WCTemplputParams *TP) -{ - char buf[256]; - char briefinfo[128]; - char fullinfo[8192]; - int fullinfo_len = 0; - - serv_puts("RINF"); - serv_getln(buf, sizeof buf); - if (buf[0] == '1') { - - while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - if (fullinfo_len < (sizeof fullinfo - sizeof buf)) { - strcpy(&fullinfo[fullinfo_len], buf); - fullinfo_len += strlen(buf); - } - } - - safestrncpy(briefinfo, fullinfo, sizeof briefinfo); - strcpy(&briefinfo[50], "..."); - - wc_printf("
" - ); - escputs(briefinfo); - wc_printf("
"); - wc_printf("\"%s\"", - _("Close window") - ); - escputs(fullinfo); - wc_printf("
"); - } - else { - wc_printf(" "); - } -} - - - - -/* - * Display room banner icon. - * The server doesn't actually need the room name, but we supply it in - * order to keep the browser from using a cached icon from another room. - */ -void embed_room_graphic(StrBuf *Target, WCTemplputParams *TP) -{ - char buf[SIZ]; - - serv_puts("OIMG _roompic_"); - serv_getln(buf, sizeof buf); - if (buf[0] == '2') { - wc_printf("CurRoom.name)); - wc_printf("\">"); - serv_puts("CLOS"); - serv_getln(buf, sizeof buf); - } - else if (WC->CurRoom.view == VIEW_ADDRESSBOOK) { - wc_printf("\"\"" - ); - } - else if ( (WC->CurRoom.view == VIEW_CALENDAR) || (WC->CurRoom.view == VIEW_CALBRIEF) ) { - wc_printf("\"\"" - ); - } - else if (WC->CurRoom.view == VIEW_TASKS) { - wc_printf("\"\"" - ); - } - else if (WC->CurRoom.view == VIEW_NOTES) { - wc_printf("\"\"" - ); - } - else if (WC->CurRoom.view == VIEW_MAILBOX) { - wc_printf("\"\"" - ); - } - else { - wc_printf("\"\"" - ); - } - -} - - - -/* - * Display the current view and offer an option to change it - */ -void embed_view_o_matic(StrBuf *Target, WCTemplputParams *TP) -{ - int i; - - wc_printf("
\n"); - wc_printf("\t
\n\t\n", WC->nonce); - wc_printf(" " - "
\n"); -} - - -/* - * Display a search box - */ -void embed_search_o_matic(StrBuf *Target, WCTemplputParams *TP) -{ - wc_printf("
\n"); - wc_printf("
\n", WC->nonce); - wc_printf("serv_info->serv_fulltext_enabled ? "" : "disabled "); - wc_printf("type=\"text\" name=\"query\" id=\"srchquery\" size=\"15\" maxlength=\"128\" class=\"inputbox\">\n" - ); - wc_printf("
\n"); -} /* @@ -404,31 +258,20 @@ void embed_search_o_matic(StrBuf *Target, WCTemplputParams *TP) * */ -void embed_room_banner(char *got, int navbar_style) { +void embed_room_banner(void) +{ wcsession *WCC = WC; char buf[256]; - char buf2[1024]; - char with_files[256]; - int file_count=0; - - /* - * We need to have the information returned by a GOTO server command. - * If it isn't supplied, we fake it by issuing our own GOTO. - */ - if (got == NULL) { - memset(buf, '0', 20); - buf[20] = '\0'; - serv_printf("GOTO %s", ChrPtr(WC->CurRoom.name)); - serv_getln(buf, sizeof buf); - got = buf; - } + + /* refresh current room states... */ + gotoroom(NULL); /* The browser needs some information for its own use */ wc_printf("\n", ((WC->CurRoom.RAFlags & UA_ISTRASH) != 0) - ); + ); /* * If the user happens to select the "make this my start page" link, @@ -441,315 +284,280 @@ void embed_room_banner(char *got, int navbar_style) { StrBufPrintf(WCC->Hdr->this_page, "dotskip?room=%s", ChrPtr(WC->CurRoom.name) - ); - - /* Check for new mail. */ - WC->new_mail = extract_int(&got[4], 9); - WC->CurRoom.view = extract_int(&got[4], 11); - - /* Is this a directory room and does it contain files and how many? */ - if ((WC->CurRoom.QRFlags & QR_DIRECTORY) && (WC->CurRoom.QRFlags & QR_VISDIR)) - { - serv_puts("RDIR"); - serv_getln(buf2, sizeof buf2); - if (buf2[0] == '1') while (serv_getln(buf2, sizeof buf2), strcmp(buf2, "000")) - file_count++; - snprintf (with_files, sizeof with_files, - "; %d %s ", - file_count, - ((file_count>1) || (file_count == 0) ? _("files") : _("file"))); - } - else - strcpy (with_files, ""); - - svprintf(HKEY("NUMMSGS"), WCS_STRING, - _("%d new of %d messages%s"), - extract_int(&got[4], 1), - extract_int(&got[4], 2), - with_files ); - svcallback("ROOMPIC", embed_room_graphic); - svcallback("ROOMINFO", readinfo); - svcallback("VIEWOMATIC", embed_view_o_matic); - svcallback("SEARCHOMATIC", embed_search_o_matic); - svcallback("START", offer_start_page); - + do_template("roombanner", NULL); /* roombanner contains this for mobile */ - if (navbar_style != navbar_none && (WC->is_mobile < 1)) { + if (WC->is_mobile) + return; - wc_printf("
\n"); } @@ -764,12 +572,16 @@ long gotoroom(const StrBuf *gname) long err = 0; /* store ungoto information */ - strcpy(WCC->ugname, ChrPtr(WCC->CurRoom.name)); + if (StrLength(gname) > 0) + strcpy(WCC->ugname, ChrPtr(WCC->CurRoom.name)); WCC->uglsn = ls; Buf = NewStrBuf(); /* move to the new room */ - serv_printf("GOTO %s", ChrPtr(gname)); + if (StrLength(gname) > 0) + serv_printf("GOTO %s", ChrPtr(gname)); + else /* or just refresh the current state... */ + serv_printf("GOTO"); StrBuf_ServGetln(Buf); if (GetServerStatus(Buf, &err) != 2) { serv_puts("GOTO _BASEROOM_"); @@ -786,9 +598,12 @@ long gotoroom(const StrBuf *gname) } ParseGoto(&WCC->CurRoom, Buf); - remove_march(WCC->CurRoom.name); - if (!strcasecmp(ChrPtr(gname), "_BASEROOM_")) - remove_march(gname); + if (StrLength(gname) > 0) + { + remove_march(WCC->CurRoom.name); + if (!strcasecmp(ChrPtr(gname), "_BASEROOM_")) + remove_march(gname); + } FreeStrBuf(&Buf); return err; @@ -845,8 +660,9 @@ void ParseGoto(folder *room, StrBuf *Line) room->is_inbox = StrBufExtractNext_long(Line, &Pos, '|'); // is_mailbox flag = StrBufExtractNext_long(Line, &Pos, '|'); - if (WCC->is_aide || flag) + if (WCC->is_aide || flag) { room->RAFlags |= UA_ADMINALLOWED; + } room->UsersNewMAilboxMessages = StrBufExtractNext_long(Line, &Pos, '|'); @@ -893,10 +709,373 @@ void ParseGoto(folder *room, StrBuf *Line) } /* get a pointer to the floor we're on: */ + if (WCC->Floors == NULL) + GetFloorListHash(NULL, NULL); + GetHash(WCC->Floors, IKEY(room->floorid), &vFloor); room->Floor = (const Floor*) vFloor; } +void LoadRoomAide(void) +{ + wcsession *WCC = WC; + StrBuf *Buf; + + if (WCC->CurRoom.RoomAideLoaded) + return; + + WCC->CurRoom.RoomAideLoaded = 1; + Buf = NewStrBuf(); + serv_puts("GETA"); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) != 2) { + FlushStrBuf(WCC->CurRoom.RoomAide); + AppendImportantMessage (ChrPtr(Buf) + 4, + StrLength(Buf) - 4); + } else { + const char *Pos; + + Pos = ChrPtr(Buf) + 4; + + FreeStrBuf(&WCC->CurRoom.RoomAide); + WCC->CurRoom.RoomAide = NewStrBufPlain (NULL, StrLength (Buf)); + + StrBufExtract_NextToken(WCC->CurRoom.RoomAide, Buf, &Pos, '|'); + } + FreeStrBuf (&Buf); +} +void tmplput_CurrentRoomFloorName(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + folder *Folder = &WCC->CurRoom; + const Floor *pFloor = Folder->Floor; + + if (pFloor == NULL) + return; + + StrBufAppendTemplate(Target, TP, pFloor->Name, 0); +} + +void tmplput_CurrentRoomAide(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + + LoadRoomAide(); + + StrBufAppendTemplate(Target, TP, WCC->CurRoom.RoomAide, 0); +} + + +void LoadRoomXA (void) +{ + wcsession *WCC = WC; + StrBuf *Buf; + + if (WCC->CurRoom.XALoaded) + return; + + WCC->CurRoom.XALoaded = 1; + Buf = NewStrBuf(); + serv_puts("GETA"); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) != 2) { + FlushStrBuf(WCC->CurRoom.XAPass); + FlushStrBuf(WCC->CurRoom.Directory); + + AppendImportantMessage (ChrPtr(Buf) + 4, + StrLength(Buf) - 4); + } else { + const char *Pos; + + Pos = ChrPtr(Buf) + 4; + + FreeStrBuf(&WCC->CurRoom.XAPass); + FreeStrBuf(&WCC->CurRoom.Directory); + + WCC->CurRoom.XAPass = NewStrBufPlain (NULL, StrLength (Buf)); + WCC->CurRoom.Directory = NewStrBufPlain (NULL, StrLength (Buf)); + + StrBufSkip_NTokenS(Buf, &Pos, '|', 1); /* The Name, we already know... */ + StrBufExtract_NextToken(WCC->CurRoom.XAPass, Buf, &Pos, '|'); + StrBufExtract_NextToken(WCC->CurRoom.Directory, Buf, &Pos, '|'); + StrBufSkip_NTokenS(Buf, &Pos, '|', 2); /* QRFlags, FloorNum we already know... */ + WCC->CurRoom.Order = StrBufExtractNext_long(Buf, &Pos, '|'); + /* defview, we already know you. */ + /* QR2Flags, we already know them... */ + + } + FreeStrBuf (&Buf); +} + + +void LoadXRoomPic(void) +{ + wcsession *WCC = WC; + StrBuf *Buf; + + if (WCC->CurRoom.XHaveRoomPicLoaded) + return; + + WCC->CurRoom.XHaveRoomPicLoaded = 1; + Buf = NewStrBuf(); + serv_puts("OIMG _roompic_"); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) != 2) { + WCC->CurRoom.XHaveRoomPic = 0; + } else { + WCC->CurRoom.XHaveRoomPic = 1; + } + serv_puts("CLOS"); + StrBuf_ServGetln(Buf); + GetServerStatus(Buf, NULL); + FreeStrBuf (&Buf); +} + +int ConditionalThisRoomXHavePic(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + + if (WCC == NULL) + return 0; + + LoadXRoomPic(); + return WCC->CurRoom.XHaveRoomPic == 1; +} + +void LoadXRoomInfoText(void) +{ + wcsession *WCC = WC; + StrBuf *Buf; + int Done = 0; + + if (WCC->CurRoom.XHaveInfoTextLoaded) + return; + + WCC->CurRoom.XHaveInfoTextLoaded = 1; + Buf = NewStrBuf(); + + serv_puts("RINF"); + + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) == 1) { + WCC->CurRoom.XInfoText = NewStrBuf (); + + while (!Done && StrBuf_ServGetln(Buf)>=0) { + if ( (StrLength(Buf)==3) && + !strcmp(ChrPtr(Buf), "000")) + Done = 1; + else + StrBufAppendBuf(WCC->CurRoom.XInfoText, Buf, 0); + } + } + + FreeStrBuf (&Buf); +} + +int ConditionalThisRoomXHaveInfoText(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + + if (WCC == NULL) + return 0; + + LoadXRoomInfoText(); + return (StrLength(WCC->CurRoom.XInfoText)>0); +} + +void tmplput_CurrentRoomInfoText(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + + LoadXRoomInfoText(); + + StrBufAppendTemplate(Target, TP, WCC->CurRoom.XAPass, 1); +} + +void LoadXRoomXCountFiles(void) +{ + wcsession *WCC = WC; + StrBuf *Buf; + int Done = 0; + + if (WCC->CurRoom.XHaveDownloadCount) + return; + + WCC->CurRoom.XHaveDownloadCount = 1; + + Buf = NewStrBuf(); + serv_puts("RDIR"); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) == 1) { + + while (!Done && StrBuf_ServGetln(Buf)>=0) { + if ( (StrLength(Buf)==3) && + !strcmp(ChrPtr(Buf), "000")) + Done = 1; + else + WCC->CurRoom.XDownloadCount++; + } + } + + FreeStrBuf (&Buf); +} + +void tmplput_CurrentRoomXNFiles(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + + LoadXRoomXCountFiles(); + + StrBufAppendPrintf(Target, "%d", WCC->CurRoom.XDownloadCount); +} + +void tmplput_CurrentRoomX_FileString(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + + LoadXRoomXCountFiles(); + + if (WCC->CurRoom.XDownloadCount == 1) + StrBufAppendBufPlain(Target, _("file"), -1, 0); + else + StrBufAppendBufPlain(Target, _("files"), -1, 0); +} + +void tmplput_CurrentRoomPass(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + + LoadRoomXA(); + + StrBufAppendTemplate(Target, TP, WCC->CurRoom.XAPass, 0); +} +void tmplput_CurrentRoomDirectory(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + + LoadRoomXA(); + + StrBufAppendTemplate(Target, TP, WCC->CurRoom.Directory, 0); +} +void tmplput_CurrentRoomOrder(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + + LoadRoomXA(); + + StrBufAppendPrintf(Target, "%d", WCC->CurRoom.Order); +} +void tmplput_CurrentRoomDefView(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + + StrBufAppendPrintf(Target, "%d", WCC->CurRoom.defview); +} + +void tmplput_CurrentRoom_nNewMessages(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + + LoadRoomXA(); + + StrBufAppendPrintf(Target, "%d", WCC->CurRoom.nNewMessages); +} + +void tmplput_CurrentRoom_nTotalMessages(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + + LoadRoomXA(); + + StrBufAppendPrintf(Target, "%d", WCC->CurRoom.nTotalMessages); +} + +int ConditionalThisRoomOrder(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + long CheckThis; + + if (WCC == NULL) + return 0; + + LoadRoomXA(); + + CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0); + return CheckThis == WCC->CurRoom.Order; +} + +int ConditionalThisRoomDefView(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + long CheckThis; + + if (WCC == NULL) + return 0; + + CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0); + return CheckThis == WCC->CurRoom.defview; +} + +int ConditionalThisRoomHaveView(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + long CheckThis; + + if (WCC == NULL) + return 0; + + CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0); + if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS)) + { + LogTemplateError(Target, "Conditional", ERR_PARM2, TP, + "Roomview [%ld] not valid\n", + CheckThis); + return 0; + } + + return exchangeable_views [WCC->CurRoom.defview][CheckThis] != VIEW_MAX; +} + +void tmplput_CurrentRoomViewString(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + StrBuf *Buf; + + if ((WCC == NULL) || + (WCC->CurRoom.defview >= VIEW_MAX) || + (WCC->CurRoom.defview < VIEW_BBS)) + { + LogTemplateError(Target, "Token", ERR_PARM2, TP, + "Roomview [%ld] not valid\n", + (WCC != NULL)? + WCC->CurRoom.defview : -1); + return; + } + + Buf = NewStrBufPlain(_(viewdefs[WCC->CurRoom.defview]), -1); + StrBufAppendTemplate(Target, TP, Buf, 0); + FreeStrBuf(&Buf); +} + +void tmplput_RoomViewString(StrBuf *Target, WCTemplputParams *TP) +{ + long CheckThis; + StrBuf *Buf; + + CheckThis = GetTemplateTokenNumber(Target, TP, 0, 0); + if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS)) + { + LogTemplateError(Target, "Token", ERR_PARM2, TP, + "Roomview [%ld] not valid\n", + CheckThis); + return; + } + + Buf = NewStrBufPlain(_(viewdefs[CheckThis]), -1); + StrBufAppendTemplate(Target, TP, Buf, 0); + FreeStrBuf(&Buf); +} + /* * goto next room @@ -2631,10 +2810,11 @@ void entroom(void) serv_getln(buf, sizeof buf); WCC->CurRoom.view = er_view; - if (WCC->is_aide || WCC->is_room_aide) + if ( (WCC != NULL) && ( (WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) ) { display_editroom (); - else + } else { do_change_view(er_view); /* Now go there */ + } } @@ -3103,7 +3283,7 @@ void tmplput_current_room(StrBuf *Target, WCTemplputParams *TP) void tmplput_roombanner(StrBuf *Target, WCTemplputParams *TP) { wc_printf("
\n"); - embed_room_banner(NULL, navbar_default); + embed_room_banner(); wc_printf("
\n"); } @@ -3142,6 +3322,22 @@ int ConditionalHaveUngoto(StrBuf *Target, WCTemplputParams *TP) (strcasecmp(WCC->ugname, ChrPtr(WCC->CurRoom.name)) == 0)); } + +int ConditionalRoomHas_UAFlag(StrBuf *Target, WCTemplputParams *TP) +{ + folder *Folder = (folder *)(TP->Context); + long UA_CheckFlag; + + UA_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0); + if (UA_CheckFlag == 0) + LogTemplateError(Target, "Conditional", ERR_PARM1, TP, + "requires one of the #\"UA_*\"- defines or an integer flag 0 is invalid!"); + + return ((Folder->RAFlags & UA_CheckFlag) != 0); +} + + + int ConditionalCurrentRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP) { long QR_CheckFlag; @@ -3212,14 +3408,64 @@ int ConditionalIsRoomtype(StrBuf *Target, WCTemplputParams *TP) if ((WCC == NULL) || (TP->Tokens->nParameters < 3)) - return 0; + { + return ((WCC->CurRoom.view < VIEW_BBS) || + (WCC->CurRoom.view > VIEW_MAX)); + } + return WCC->CurRoom.view == GetTemplateTokenNumber(Target, TP, 2, VIEW_BBS); } + +HashList *GetWhoKnowsHash(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + StrBuf *Line; + StrBuf *Token; + long State; + HashList *Whok = NULL; + int Done = 0; + int n; + + serv_puts("WHOK"); + Line = NewStrBuf(); + Token = NewStrBuf(); + StrBuf_ServGetln(Line); + if (GetServerStatus(Line, &State) == 1) + { + Whok = NewHash(1, Flathash); + while(!Done && StrBuf_ServGetln(Line)) + if ( (StrLength(Line)==3) && + !strcmp(ChrPtr(Line), "000")) + { + Done = 1; + } + else + { + + const char *Pos = NULL; + Token = NewStrBufPlain (NULL, StrLength(Line)); + StrBufExtract_NextToken(Token, Line, &Pos, '|'); + + Put(Whok, + IKEY(n), + Token, + HFreeStrBuf); + } + } + else if (State == 550) + StrBufAppendBufPlain(WCC->ImportantMsg, + _("Higher access is required to access this function."), -1, 0); + + + return Whok; +} + void InitModule_ROOMOPS (void) { + initialize_viewdefs(); RegisterPreference("roomlistview", _("Room list view"), PRF_STRING, @@ -3228,6 +3474,7 @@ InitModule_ROOMOPS RegisterNamespace("ROOMNAME", 0, 1, tmplput_RoomName, NULL, CTX_NONE); + WebcitAddUrlHandler(HKEY("knrooms"), "", 0, knrooms, 0); WebcitAddUrlHandler(HKEY("dotgoto"), "", 0, dotgoto, NEED_URL); WebcitAddUrlHandler(HKEY("dotskip"), "", 0, dotskip, NEED_URL); @@ -3255,6 +3502,29 @@ InitModule_ROOMOPS RegisterConditional(HKEY("COND:THISROOM:FLAG:QR2"), 0, ConditionalCurrentRoomHas_QRFlag2, CTX_NONE); RegisterConditional(HKEY("COND:ROOM:FLAG:QR2"), 0, ConditionalRoomHas_QRFlag2, CTX_ROOMS); + RegisterConditional(HKEY("COND:ROOM:FLAG:UA"), 0, ConditionalRoomHas_UAFlag, CTX_ROOMS); + + RegisterIterator("ITERATE:THISROOM:WHO_KNOWS", 0, NULL, GetWhoKnowsHash, NULL, DeleteHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG); + RegisterNamespace("THISROOM:MSGS:NEW", 0, 0, tmplput_CurrentRoom_nNewMessages, NULL, CTX_NONE); + RegisterNamespace("THISROOM:MSGS:TOTAL", 0, 0, tmplput_CurrentRoom_nTotalMessages, NULL, CTX_NONE); + + RegisterNamespace("THISROOM:FLOOR:NAME", 0, 1, tmplput_CurrentRoomFloorName, NULL, CTX_NONE); + RegisterNamespace("THISROOM:AIDE", 0, 1, tmplput_CurrentRoomAide, NULL, CTX_NONE); + RegisterNamespace("THISROOM:PASS", 0, 1, tmplput_CurrentRoomPass, NULL, CTX_NONE); + RegisterNamespace("THISROOM:DIRECTORY", 0, 1, tmplput_CurrentRoomDirectory, NULL, CTX_NONE); + RegisterNamespace("THISROOM:ORDER", 0, 0, tmplput_CurrentRoomOrder, NULL, CTX_NONE); + RegisterNamespace("THISROOM:DEFAULT_VIEW", 0, 0, tmplput_CurrentRoomDefView, NULL, CTX_NONE); + RegisterConditional(HKEY("COND:THISROOM:HAVE_VIEW"), 0, ConditionalThisRoomHaveView, CTX_NONE); + RegisterNamespace("THISROOM:VIEW_STRING", 0, 1, tmplput_CurrentRoomViewString, NULL, CTX_NONE); + RegisterNamespace("ROOM:VIEW_STRING", 1, 2, tmplput_RoomViewString, NULL, CTX_NONE); + + RegisterNamespace("THISROOM:INFOTEXT", 1, 2, tmplput_CurrentRoomInfoText, NULL, CTX_NONE); + RegisterConditional(HKEY("COND:THISROOM:ORDER"), 0, ConditionalThisRoomOrder, CTX_NONE); + RegisterConditional(HKEY("COND:THISROOM:DEFAULT_VIEW"), 0, ConditionalThisRoomDefView, CTX_NONE); + RegisterConditional(HKEY("COND:THISROOM:HAVE_PIC"), 0, ConditionalThisRoomXHavePic, CTX_NONE); + RegisterConditional(HKEY("COND:THISROOM:HAVE_INFOTEXT"), 0, ConditionalThisRoomXHaveInfoText, CTX_NONE); + RegisterNamespace("THISROOM:FILES:N", 0, 1, tmplput_CurrentRoomXNFiles, NULL, CTX_NONE); + RegisterNamespace("THISROOM:FILES:STR", 0, 1, tmplput_CurrentRoomX_FileString, NULL, CTX_NONE); REGISTERTokenParamDefine(QR_PERMANENT); REGISTERTokenParamDefine(QR_INUSE); @@ -3313,11 +3583,21 @@ InitModule_ROOMOPS REGISTERTokenParamDefine(VIEW_JOURNAL); REGISTERTokenParamDefine(VIEW_BLOG); - + /* GNET types: */ REGISTERTokenParamDefine(ignet_push_share); + { /* these are the parts of an IGNET push config */ + REGISTERTokenParamDefine(GNET_IGNET_NODE); + REGISTERTokenParamDefine(GNET_IGNET_ROOM); + } REGISTERTokenParamDefine(listrecp); REGISTERTokenParamDefine(digestrecp); REGISTERTokenParamDefine(pop3client); + { /* These are the parts of a pop3 client line... */ + REGISTERTokenParamDefine(GNET_POP3_HOST); + REGISTERTokenParamDefine(GNET_POP3_USER); + REGISTERTokenParamDefine(GNET_POP3_DONT_DELETE_REMOTE); + REGISTERTokenParamDefine(GNET_POP3_INTERVAL); + } REGISTERTokenParamDefine(rssclient); REGISTERTokenParamDefine(participate); @@ -3346,5 +3626,9 @@ SessionDestroyModule_ROOMOPS free_march_list(sess); DeleteHash(&sess->Floors); + DeleteHash(&sess->Rooms); + DeleteHash(&sess->FloorsByName); } + + /*@}*/