This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
deb-mbse/mbsebbs/page.c

338 lines
7.5 KiB
C
Raw Normal View History

2001-08-17 05:46:24 +00:00
/*****************************************************************************
*
* $Id$
2001-08-17 05:46:24 +00:00
* Purpose ...............: Sysop Paging
* Todo ..................: Implement new config settings.
*
*****************************************************************************
2005-08-29 10:29:22 +00:00
* Copyright (C) 1997-2005
2001-08-17 05:46:24 +00:00
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
* 1971 BV IJmuiden
* the Netherlands
*
* This file is part of MBSE BBS.
*
* This BBS is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2, or (at your option) any
* later version.
*
* MBSE BBS is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MBSE BBS; see the file COPYING. If not, write to the Free
2003-08-15 20:05:34 +00:00
* Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
2001-08-17 05:46:24 +00:00
*****************************************************************************/
2002-06-30 12:48:44 +00:00
#include "../config.h"
2004-02-21 17:22:00 +00:00
#include "../lib/mbselib.h"
2001-08-17 05:46:24 +00:00
#include "../lib/mbse.h"
2002-01-07 19:16:03 +00:00
#include "../lib/users.h"
#include "dispfile.h"
#include "input.h"
2001-08-17 05:46:24 +00:00
#include "chat.h"
#include "page.h"
#include "timeout.h"
#include "mail.h"
#include "language.h"
#include "term.h"
2004-11-03 20:48:45 +00:00
#include "ttyio.h"
2001-08-17 05:46:24 +00:00
2003-03-20 22:43:40 +00:00
extern pid_t mypid;
2001-08-17 05:46:24 +00:00
/*
* Function to Page Sysop
*/
void Page_Sysop(char *String)
{
2003-03-20 22:43:40 +00:00
int i;
char *Reason, temp[81];
static char buf[128];
2002-07-08 19:40:22 +00:00
clear();
if (SYSOP == TRUE) {
/*
* Forbid the sysop to page, paging himself causes troubles on the
* chatserver, the sysop can only use mbmon.
*/
Syslog('+', "The Sysop attempted to page the Sysop");
pout(LIGHTRED, BLACK, (char *)"The Sysop cannot page the Sysop!");
Enter(1);
Pause();
return;
}
2002-07-08 19:40:22 +00:00
Reason = calloc(81, sizeof(char));
/* MBSE BBS Chat */
2004-11-03 22:45:41 +00:00
poutCenter(LIGHTRED, BLACK, (char *) Language(151));
2002-07-08 19:40:22 +00:00
if (CFG.iAskReason) {
2004-11-03 22:45:41 +00:00
locate(4, 0);
/* Enter a short reason for chat */
poutCenter(GREEN, BLACK, (char *)Language(28));
locate(6,0);
2002-07-08 19:40:22 +00:00
colour(BLUE, BLACK);
2004-11-03 20:48:45 +00:00
PUTCHAR(213);
2002-07-08 19:40:22 +00:00
for (i = 0; i < 78; i++)
2004-11-03 20:48:45 +00:00
PUTCHAR(205);
PUTCHAR(184);
Enter(1);
2002-07-08 19:40:22 +00:00
2004-11-03 22:45:41 +00:00
PUTCHAR(' ');
2002-07-08 19:40:22 +00:00
colour(LIGHTGRAY, BLACK);
for (i = 0; i < 78; i++)
2004-11-03 20:48:45 +00:00
PUTCHAR(250);
Enter(1);
2001-08-17 05:46:24 +00:00
2002-07-08 19:40:22 +00:00
colour(BLUE, BLACK);
2004-11-03 20:48:45 +00:00
PUTCHAR(212);
2002-07-08 19:40:22 +00:00
for (i = 0; i < 78; i++)
2004-11-03 20:48:45 +00:00
PUTCHAR(205);
PUTCHAR(190);
Enter(1);
2002-07-08 19:40:22 +00:00
locate(7, 2);
colour(LIGHTGRAY, BLACK);
temp[0] = '\0';
2002-07-08 19:40:22 +00:00
GetPageStr(temp, 76);
if ((strcmp(temp, "")) == 0)
return;
Syslog('+', "Chat Reason: %s", temp);
strcpy(Reason, temp);
2003-03-20 22:43:40 +00:00
} else {
2005-08-29 10:29:22 +00:00
snprintf(Reason, 81, "User want's to chat");
2002-07-08 19:40:22 +00:00
}
CFG.iMaxPageTimes--;
if (CFG.iMaxPageTimes <= 0) {
if (!DisplayFile((char *)"maxpage")) {
/* If i is FALSE display hard coded message */
Enter(1);
2003-03-20 22:43:40 +00:00
/* You have paged the Sysop the maximum times allowed. */
2002-07-08 19:40:22 +00:00
pout(WHITE, BLACK, (char *) Language(154));
Enter(2);
}
2001-08-17 05:46:24 +00:00
2002-07-08 19:40:22 +00:00
Syslog('!', "Attempted to page Sysop, above maximum page limit.");
Pause();
2003-03-20 22:43:40 +00:00
free(Reason);
return;
}
locate(14, ((80 - strlen(String) ) / 2 - 2));
pout(WHITE, BLACK, (char *)"[");
pout(LIGHTGRAY, BLACK, String);
pout(WHITE, BLACK, (char *)"]");
locate(16, ((80 - CFG.iPageLength) / 2 - 2));
pout(WHITE, BLACK, (char *)"[");
colour(BLUE, BLACK);
for (i = 0; i < CFG.iPageLength; i++)
2004-11-03 20:48:45 +00:00
PUTCHAR(176);
2003-03-20 22:43:40 +00:00
pout(WHITE, BLACK, (char *)"]");
locate(16, ((80 - CFG.iPageLength) / 2 - 2) + 1);
snprintf(buf, 128, "CPAG:2,%d,%s;", mypid, clencode(Reason));
2003-03-20 22:43:40 +00:00
if (socket_send(buf)) {
Syslog('+', "Failed to send message to mbtask");
free(Reason);
return;
}
strcpy(buf, socket_receive());
/*
* Check if sysop is busy
*/
if (strcmp(buf, "100:1,1;") == 0) {
/* The SysOp is currently speaking to somebody else */
pout(LIGHTMAGENTA, BLACK, (char *) Language(152));
/* Try paging him again in a few minutes ... */
pout(LIGHTGREEN, BLACK, (char *) Language(153));
Enter(2);
Syslog('+', "SysOp was busy chatting with another user");
Pause();
free(Reason);
return;
}
2002-07-08 19:40:22 +00:00
2003-03-20 22:43:40 +00:00
/*
* Check if sysop is not available
*/
if (strcmp(buf, "100:1,2;") == 0) {
Syslog('+', "Sysop is not available for chat");
}
2002-07-08 19:40:22 +00:00
2003-03-20 22:43:40 +00:00
/*
* Check for other errors
*/
if (strcmp(buf, "100:1,3;") == 0) {
2004-11-03 20:48:45 +00:00
pout(LIGHTRED, BLACK, (char *)"Internal system error, the sysop is informed");
2003-03-20 22:43:40 +00:00
Enter(2);
Syslog('!', "Got error on page sysop command");
Pause();
free(Reason);
return;
}
2001-08-17 05:46:24 +00:00
2003-03-20 22:43:40 +00:00
if (strcmp(buf, "100:0;") == 0) {
/*
* Page accpeted, wait until sysop responds
*/
2002-07-08 19:40:22 +00:00
colour(LIGHTBLUE, BLACK);
for (i = 0; i < CFG.iPageLength; i++) {
2004-11-03 20:48:45 +00:00
PUTCHAR(219);
2002-07-08 19:40:22 +00:00
sleep(1);
2001-08-17 05:46:24 +00:00
2005-08-29 10:29:22 +00:00
snprintf(buf, 128, "CISC:1,%d", mypid);
2003-04-01 21:41:36 +00:00
if (socket_send(buf) == 0) {
strcpy(buf, socket_receive());
if (strcmp(buf, "100:1,1;") == 0) {
/*
* First cancel page request
*/
2005-08-29 10:29:22 +00:00
snprintf(buf, 128, "CCAN:1,%d;", mypid);
2003-04-01 21:41:36 +00:00
socket_send(buf);
socket_receive();
Syslog('+', "Sysop responded to paging request");
Chat(exitinfo.Name, (char *)"#sysop");
free(Reason);
return;
}
}
2001-08-17 05:46:24 +00:00
}
2003-03-20 22:43:40 +00:00
/*
* Cancel page request
*/
2005-08-29 10:29:22 +00:00
snprintf(buf, 128, "CCAN:1,%d;", mypid);
2003-03-20 22:43:40 +00:00
socket_send(buf);
strcpy(buf, socket_receive());
2002-07-08 19:40:22 +00:00
}
2003-03-20 22:43:40 +00:00
PageReason();
2004-11-03 20:48:45 +00:00
Enter(3);
2003-03-20 22:43:40 +00:00
Pause();
if (strlen(Reason))
SysopComment(Reason);
else
SysopComment((char *)"Failed chat");
2002-07-08 19:40:22 +00:00
free(Reason);
Pause();
2001-08-17 05:46:24 +00:00
}
/*
* Function gets string from user for Pager Function
*/
void GetPageStr(char *sStr, int iMaxlen)
{
2002-07-08 19:40:22 +00:00
unsigned char ch = 0;
int iPos = 0;
2001-08-17 05:46:24 +00:00
2002-07-08 19:40:22 +00:00
strcpy(sStr, "");
alarm_on();
while (ch != 13) {
ch = Readkey();
if (((ch == 8) || (ch == KEY_DEL) || (ch == 127)) && (iPos > 0)) {
2004-11-03 20:48:45 +00:00
PUTCHAR('\b');
PUTCHAR(250);
PUTCHAR('\b');
2002-07-08 19:40:22 +00:00
sStr[--iPos]='\0';
2001-08-17 05:46:24 +00:00
}
2002-07-08 19:40:22 +00:00
if (ch > 31 && ch < 127) {
if (iPos <= iMaxlen) {
iPos++;
2005-08-29 13:42:56 +00:00
snprintf(sStr + strlen(sStr), 5, "%c", ch);
2004-11-03 20:48:45 +00:00
PUTCHAR(ch);
2002-07-08 19:40:22 +00:00
fflush(stdout);
} else
ch=13;
2001-08-17 05:46:24 +00:00
}
2002-07-08 19:40:22 +00:00
}
2001-08-17 05:46:24 +00:00
2004-11-03 20:48:45 +00:00
Enter(1);
2001-08-17 05:46:24 +00:00
}
/*
* Function gets page reason from a file in the txtfiles directory
* randomly generates a number and prints the string to the screen
*/
void PageReason()
{
2002-07-08 19:40:22 +00:00
FILE *Page;
int iLoop = FALSE, id, i, j = 0;
int Lines = 0, Count = 0, iFoundString = FALSE;
char *String;
char *temp;
temp = calloc(PATH_MAX, sizeof(char));
String = calloc(81, sizeof(char));
2005-08-29 10:29:22 +00:00
snprintf(temp, PATH_MAX, "%s/page.asc", CFG.bbs_txtfiles);
2002-07-08 19:40:22 +00:00
if ((Page = fopen(temp, "r")) != NULL) {
while (( fgets(String, 80 ,Page)) != NULL)
Lines++;
rewind(Page);
Count = Lines;
id = getpid();
do {
i = rand();
j = i % id;
if ((j <= Count) && (j != 0))
iLoop = 1;
} while (!iLoop);
Lines = 0;
while (( fgets(String,80,Page)) != NULL) {
if (Lines == j) {
Striplf(String);
2001-08-17 05:46:24 +00:00
locate(18, ((78 - strlen(String) ) / 2));
2004-11-03 20:48:45 +00:00
pout(WHITE, BLACK, (char *)"[");
pout(LIGHTBLUE, BLACK, String);
pout(WHITE, BLACK, (char *)"]");
2002-07-08 19:40:22 +00:00
iFoundString = TRUE;
}
2001-08-17 05:46:24 +00:00
2002-07-08 19:40:22 +00:00
Lines++; /* Increment Lines until correct line is found */
}
} /* End of Else */
if (!iFoundString) {
/* Sysop currently is not available ... please leave a comment */
2005-08-29 10:29:22 +00:00
snprintf(String, 81, "%s", (char *) Language(155));
2002-07-08 19:40:22 +00:00
locate(18, ((78 - strlen(String) ) / 2));
2004-11-03 20:48:45 +00:00
pout(WHITE, BLACK, (char *)"[");
pout(LIGHTBLUE, BLACK, String);
pout(WHITE, BLACK, (char *)"]");
2002-07-08 19:40:22 +00:00
}
free(temp);
free(String);
2001-08-17 05:46:24 +00:00
}