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("
",
- _("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");
-}
-
-
-/*
- * Display a search box
- */
-void embed_search_o_matic(StrBuf *Target, WCTemplputParams *TP)
-{
- 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("");
- if (navbar_style == navbar_default) wc_printf(
- "- "
- ""
- ""
+ wc_printf("
");
+
+ wc_printf(
+ "- "
+ ""
+ ""
+ "%s"
+ "
\n", _("Ungoto")
+ );
+
+ if (WC->CurRoom.view == VIEW_BBS) {
+ wc_printf(
+ "- "
+ ""
+ ""
"%s"
- "
\n", _("Ungoto")
+ "\n", _("Read new messages")
);
+ }
- if ( (navbar_style == navbar_default) && (WC->CurRoom.view == VIEW_BBS) ) {
+ switch(WC->CurRoom.view) {
+ case VIEW_ADDRESSBOOK:
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", _("View contacts")
+ );
+ break;
+ case VIEW_CALENDAR:
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", _("Day view")
+ );
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", _("Month view")
+ );
+ break;
+ case VIEW_CALBRIEF:
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", _("Calendar list")
+ );
+ break;
+ case VIEW_TASKS:
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", _("View tasks")
+ );
+ break;
+ case VIEW_NOTES:
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", _("View notes")
+ );
+ break;
+ case VIEW_MAILBOX:
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", _("Refresh message list")
+ );
+ break;
+ case VIEW_WIKI:
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", _("Wiki home")
+ );
+ break;
+ default:
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", _("Read all messages")
+ );
+ break;
+ }
+
+ switch(WC->CurRoom.view) {
+ case VIEW_ADDRESSBOOK:
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", _("Add new contact")
+ );
+ break;
+ case VIEW_CALENDAR:
+ case VIEW_CALBRIEF:
+ wc_printf("- "
+ ""
+ ""
+ "%s"
+ "
\n", _("Add new event")
+ );
+ break;
+ case VIEW_TASKS:
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", _("Add new task")
+ );
+ break;
+ case VIEW_NOTES:
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", _("Add new note")
+ );
+ break;
+ case VIEW_WIKI:
+ safestrncpy(buf, bstr("page"), sizeof buf);
+ if (IsEmptyStr(buf)) {
+ safestrncpy(buf, "home", sizeof buf);
+ }
+ str_wiki_index(buf);
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", buf, _("Edit this page")
+ );
+
+ if (bmstrcasestr((char *)ChrPtr(WCC->Hdr->HR.ReqLine), "wiki_history")) {
+ /* already viewing history; display a link to the current page */
wc_printf(
"- "
- ""
- ""
- "%s"
- "
\n", _("Read new messages")
+ ""
+ ""
+ ""
+ "%s"
+ "\n", buf, _("Current version")
);
}
-
- if (navbar_style == navbar_default) {
- switch(WC->CurRoom.view) {
- case VIEW_ADDRESSBOOK:
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", _("View contacts")
- );
- break;
- case VIEW_CALENDAR:
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", _("Day view")
- );
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", _("Month view")
- );
- break;
- case VIEW_CALBRIEF:
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", _("Calendar list")
- );
- break;
- case VIEW_TASKS:
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", _("View tasks")
- );
- break;
- case VIEW_NOTES:
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", _("View notes")
- );
- break;
- case VIEW_MAILBOX:
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", _("Refresh message list")
- );
- break;
- case VIEW_WIKI:
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", _("Wiki home")
- );
- break;
- default:
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", _("Read all messages")
- );
- break;
- }
- }
-
- if (navbar_style == navbar_default) {
- switch(WC->CurRoom.view) {
- case VIEW_ADDRESSBOOK:
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", _("Add new contact")
- );
- break;
- case VIEW_CALENDAR:
- case VIEW_CALBRIEF:
- wc_printf("- "
- ""
- ""
- "%s"
- "
\n", _("Add new event")
- );
- break;
- case VIEW_TASKS:
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", _("Add new task")
- );
- break;
- case VIEW_NOTES:
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", _("Add new note")
- );
- break;
- case VIEW_WIKI:
- safestrncpy(buf, bstr("page"), sizeof buf);
- if (IsEmptyStr(buf)) {
- safestrncpy(buf, "home", sizeof buf);
- }
- str_wiki_index(buf);
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", buf, _("Edit this page")
- );
-
- if (bmstrcasestr((char *)ChrPtr(WCC->Hdr->HR.ReqLine), "wiki_history")) {
- /* already viewing history; display a link to the current page */
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", buf, _("Current version")
- );
- }
- else {
- /* display a link to the history */
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", buf, _("History")
- );
- }
- break;
- case VIEW_MAILBOX:
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", _("Write mail")
- );
- wc_printf(
- "- "
- ""
- ""
- "%s"
- "
\n", _("Delete")
- );
- break;
- default:
- wc_printf(
- "- "
- ""
- ""
- ""
- "%s"
- "
\n", _("Enter a message")
- );
- break;
- }
+ else {
+ /* display a link to the history */
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", buf, _("History")
+ );
}
-
- if (navbar_style == navbar_default) wc_printf(
- "- "
- ""
- ""
- "%s"
- "
\n",
- _("Leave all messages marked as unread, go to next room with unread messages"),
- _("Skip this room")
+ break;
+ case VIEW_MAILBOX:
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", _("Write mail")
);
-
- if (navbar_style == navbar_default) wc_printf(
- "- "
- ""
- ""
- "%s"
- "
\n",
- _("Mark all messages as read, go to next room with unread messages"),
- _("Goto next room")
+ wc_printf(
+ "- "
+ ""
+ ""
+ "%s"
+ "
\n", _("Delete")
);
-
- wc_printf("
\n");
+ break;
+ default:
+ wc_printf(
+ "- "
+ ""
+ ""
+ ""
+ "%s"
+ "
\n", _("Enter a message")
+ );
+ break;
}
-
+
+ wc_printf(
+ "- "
+ ""
+ ""
+ "%s"
+ "
\n",
+ _("Leave all messages marked as unread, go to next room with unread messages"),
+ _("Skip this room")
+ );
+
+ wc_printf(
+ "- "
+ ""
+ ""
+ "%s"
+ "
\n",
+ _("Mark all messages as read, go to next room with unread messages"),
+ _("Goto next room")
+ );
+
+ 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);
}
+
+
/*@}*/