X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Froomops.c;h=a5243ebca34eea84ba6fba10c769e203ef2558f0;hb=2a6c57f11acf980307b93ae44392d618ff1be9f8;hp=5d1aa8eccef8139f87b8e6ebf81b7fb69c1a4ac7;hpb=1383a6259484fdbdb69f6ba1483737d9b348d005;p=citadel.git diff --git a/webcit/roomops.c b/webcit/roomops.c index 5d1aa8ecc..a5243ebca 100644 --- a/webcit/roomops.c +++ b/webcit/roomops.c @@ -9,27 +9,44 @@ 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. */ 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"); } /* @@ -230,112 +247,6 @@ void zapped_list(void) wDumpContent(1); } - -/* - * 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 */ @@ -378,22 +289,6 @@ void embed_view_o_matic(StrBuf *Target, WCTemplputParams *TP) } -/* - * 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"); -} - /* * Embed the room banner @@ -446,33 +341,6 @@ void embed_room_banner(char *got, int navbar_style) { 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)) { @@ -844,8 +712,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, '|'); @@ -892,10 +761,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 @@ -1114,7 +1346,7 @@ void display_editroom(void) wc_printf("\n"); wc_printf(" \n"); - if ( (WC->axlevel >= 6) || (WC->is_room_aide) ) { + if ( ConditionalHaveRoomeditRights(NULL, NULL)) { wc_printf("
  • "); wc_printf(_("Name of room: ")); - wc_printf("\n", + wc_printf("\n", er_name, (sizeof(er_name)-1) ); @@ -2583,6 +2815,7 @@ void entroom(void) int er_floor; int er_num_type; int er_view; + wcsession *WCC = WC; if (!havebstr("ok_button")) { strcpy(WC->ImportantMessage, @@ -2616,16 +2849,25 @@ void entroom(void) serv_getln(buf, sizeof buf); if (buf[0] != '2') { - strcpy(WC->ImportantMessage, &buf[4]); + strcpy(WCC->ImportantMessage, &buf[4]); display_main_menu(); return; } - /** TODO: Room created, now udate the left hand icon bar for this user */ + /** TODO: Room created, now update the left hand icon bar for this user */ burn_folder_cache(0); /* burn the old folder cache */ - gotoroom(er_name); - do_change_view(er_view); /* Now go there */ + + serv_printf("VIEW %d", er_view); + serv_getln(buf, sizeof buf); + WCC->CurRoom.view = er_view; + + if ( (WCC != NULL) && ( (WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) ) { + display_editroom (); + } else { + do_change_view(er_view); /* Now go there */ + } + } @@ -3009,19 +3251,22 @@ void knrooms(void) set_preference("roomlistview", ListView, 1); } /** Sanitize the input so its safe */ - if(!get_preference("roomlistview", &ListView) || + if((get_preference("roomlistview", &ListView) != 0)|| ((strcasecmp(ChrPtr(ListView), "folders") != 0) && (strcasecmp(ChrPtr(ListView), "table") != 0))) { if (ListView == NULL) { ListView = NewStrBufPlain(HKEY("rooms")); set_preference("roomlistview", ListView, 0); + ListView = NULL; } else { - StrBufPlain(ListView, HKEY("rooms")); - save_preferences(); + ListView = NewStrBufPlain(HKEY("rooms")); + set_preference("roomlistview", ListView, 0); + ListView = NULL; } } + FreeStrBuf(&ListView); url_do_template(); } @@ -3107,14 +3352,15 @@ void tmplput_ungoto(StrBuf *Target, WCTemplputParams *TP) int ConditionalRoomAide(StrBuf *Target, WCTemplputParams *TP) { wcsession *WCC = WC; - return (WCC != NULL)? (WCC->is_room_aide == 0) : 0; + return (WCC != NULL)? + ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) : 0; } int ConditionalRoomAcessDelete(StrBuf *Target, WCTemplputParams *TP) { wcsession *WCC = WC; return (WCC == NULL)? 0 : - ( (WCC->is_room_aide) || /////TODO! + ( ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) || (WCC->CurRoom.is_inbox) || (WCC->CurRoom.QRFlags2 & QR2_COLLABDEL) ); } @@ -3128,6 +3374,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; @@ -3188,7 +3450,7 @@ int ConditionalHaveRoomeditRights(StrBuf *Target, WCTemplputParams *TP) return ( (WCC!= NULL) && ((WCC->axlevel >= 6) || - (WCC->is_room_aide) || + ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) || (WCC->CurRoom.is_inbox) )); } @@ -3197,39 +3459,65 @@ int ConditionalIsRoomtype(StrBuf *Target, WCTemplputParams *TP) wcsession *WCC = WC; if ((WCC == NULL) || - (TP->Tokens->nParameters < 3) || - (TP->Tokens->Params[2]->Type != TYPE_STR)|| - (TP->Tokens->Params[2]->len < 7)) - return 0; + (TP->Tokens->nParameters < 3)) + { + return ((WCC->CurRoom.view < VIEW_BBS) || + (WCC->CurRoom.view > VIEW_MAX)); + } - switch(WCC->CurRoom.view) { - case VIEW_BBS: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_BBS")); - case VIEW_MAILBOX: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_MAILBOX")); - case VIEW_ADDRESSBOOK: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_ADDRESSBOOK")); - case VIEW_TASKS: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_TASKS")); - case VIEW_NOTES: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_NOTES")); - case VIEW_WIKI: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_WIKI")); - case VIEW_JOURNAL: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_JOURNAL")); - case VIEW_CALENDAR: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_CALENDAR")); - case VIEW_CALBRIEF: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_CALBRIEF")); - default: - return 0; + 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, @@ -3238,6 +3526,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); @@ -3265,6 +3554,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); @@ -3312,6 +3624,34 @@ InitModule_ROOMOPS REGISTERTokenParamDefine(US_COLOR); REGISTERTokenParamDefine(US_USER_SET); + REGISTERTokenParamDefine(VIEW_BBS); + REGISTERTokenParamDefine(VIEW_MAILBOX); + REGISTERTokenParamDefine(VIEW_ADDRESSBOOK); + REGISTERTokenParamDefine(VIEW_CALENDAR); + REGISTERTokenParamDefine(VIEW_TASKS); + REGISTERTokenParamDefine(VIEW_NOTES); + REGISTERTokenParamDefine(VIEW_WIKI); + REGISTERTokenParamDefine(VIEW_CALBRIEF); + 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); RegisterConditional(HKEY("COND:ROOMAIDE"), 2, ConditionalRoomAide, CTX_NONE); RegisterConditional(HKEY("COND:ACCESS:DELETE"), 2, ConditionalRoomAcessDelete, CTX_NONE); @@ -3338,5 +3678,9 @@ SessionDestroyModule_ROOMOPS free_march_list(sess); DeleteHash(&sess->Floors); + DeleteHash(&sess->Rooms); + DeleteHash(&sess->FloorsByName); } + + /*@}*/