297 lines
6.5 KiB
C
297 lines
6.5 KiB
C
|
/*****************************************************************************
|
||
|
*
|
||
|
* File ..................: bbs/page.c
|
||
|
* Purpose ...............: Sysop Paging
|
||
|
* Last modification date : 28-Jun-2001
|
||
|
* Todo ..................: Implement new config settings.
|
||
|
*
|
||
|
*****************************************************************************
|
||
|
* Copyright (C) 1997-2001
|
||
|
*
|
||
|
* 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
|
||
|
* Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||
|
*****************************************************************************/
|
||
|
|
||
|
#include "../lib/libs.h"
|
||
|
#include "../lib/mbse.h"
|
||
|
#include "../lib/structs.h"
|
||
|
#include "../lib/records.h"
|
||
|
#include "../lib/common.h"
|
||
|
#include "../lib/clcomm.h"
|
||
|
#include "funcs.h"
|
||
|
#include "funcs4.h"
|
||
|
#include "chat.h"
|
||
|
#include "page.h"
|
||
|
#include "timeout.h"
|
||
|
#include "mail.h"
|
||
|
#include "language.h"
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Function to Page Sysop
|
||
|
*/
|
||
|
void Page_Sysop(char *String)
|
||
|
{
|
||
|
int i;
|
||
|
FILE *pWritingDevice, *pBusy;
|
||
|
int iOpenDevice = FALSE; /* Flag to check if you can write to CFG.sChatDevice */
|
||
|
char *Reason;
|
||
|
char temp[81];
|
||
|
|
||
|
Reason = calloc(81, sizeof(char));
|
||
|
|
||
|
clear();
|
||
|
colour(12, 0);
|
||
|
/* MBSE BBS Chat */
|
||
|
Center((char *) Language(151));
|
||
|
|
||
|
if (CFG.iAskReason) {
|
||
|
locate(6, 0);
|
||
|
colour(1, 0);
|
||
|
printf("%c", 213);
|
||
|
for(i = 0; i < 78; i++)
|
||
|
printf("%c", 205);
|
||
|
printf("%c ", 184);
|
||
|
|
||
|
colour(7, 0);
|
||
|
for(i = 0; i < 78; i++)
|
||
|
printf("%c", 250);
|
||
|
printf("\n");
|
||
|
|
||
|
colour(1, 0);
|
||
|
printf("%c", 212);
|
||
|
for(i = 0; i < 78; i++)
|
||
|
printf("%c", 205);
|
||
|
printf("%c\n", 190);
|
||
|
|
||
|
locate(7, 2);
|
||
|
|
||
|
colour(7, 0);
|
||
|
fflush(stdout);
|
||
|
GetPageStr(temp, 76);
|
||
|
|
||
|
colour(1, 0);
|
||
|
printf("%c", 212);
|
||
|
for(i = 0; i < 78; i++)
|
||
|
printf("%c", 205);
|
||
|
printf("%c\n", 190);
|
||
|
|
||
|
if((strcmp(temp, "")) == 0)
|
||
|
return;
|
||
|
|
||
|
Syslog('+', "Chat Reason: %s", temp);
|
||
|
strcpy(Reason, temp);
|
||
|
}
|
||
|
|
||
|
if (access("/tmp/.BusyChatting", F_OK) == 0) {
|
||
|
if((pBusy = fopen("/tmp/.BusyChatting", "r")) == NULL)
|
||
|
WriteError("Unable to open BusyChatting file", pTTY);
|
||
|
else {
|
||
|
fscanf(pBusy, "%10s", temp);
|
||
|
fclose(pBusy);
|
||
|
}
|
||
|
colour(13, 0);
|
||
|
printf("%s%s\n", (char *) Language(152), temp);
|
||
|
pout(10, 0, (char *) Language(153));
|
||
|
Enter(2);
|
||
|
Syslog('+', "SysOp was busy chatting to user on %s", temp);
|
||
|
Pause();
|
||
|
free(Reason);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
CFG.iMaxPageTimes--;
|
||
|
|
||
|
if(CFG.iMaxPageTimes <= 0) {
|
||
|
if (!DisplayFile((char *)"maxpage")) {
|
||
|
/* If i is FALSE display hard coded message */
|
||
|
Enter(1);
|
||
|
pout(15, 0, (char *) Language(154));
|
||
|
Enter(2);
|
||
|
}
|
||
|
|
||
|
Syslog('!', "Attempted to page Sysop, above maximum page limit.");
|
||
|
Pause();
|
||
|
} else {
|
||
|
locate(14, ((80 - strlen(String) ) / 2 - 2));
|
||
|
pout(15, 0, (char *)"[");
|
||
|
pout(7, 0, String);
|
||
|
pout(15, 0, (char *)"]");
|
||
|
|
||
|
locate(16, ((80 - CFG.iPageLength) / 2 - 2));
|
||
|
pout(15, 0, (char *)"[");
|
||
|
colour(1, 0);
|
||
|
for(i = 0; i < CFG.iPageLength; i++)
|
||
|
printf("%c", 176);
|
||
|
pout(15, 0, (char *)"]");
|
||
|
|
||
|
locate(16, ((80 - CFG.iPageLength) / 2 - 2) + 1);
|
||
|
|
||
|
if((pWritingDevice = fopen(CFG.sChatDevice, "w")) != NULL) {
|
||
|
fprintf(pWritingDevice, "\n\n\n%s is trying to page you on %s.\n", \
|
||
|
usrconfig.sUserName, pTTY);
|
||
|
|
||
|
fprintf(pWritingDevice, "Type: '%s/bin/schat %s' to talk to him, you have", \
|
||
|
getenv("MBSE_ROOT"), pTTY);
|
||
|
fprintf(pWritingDevice, "\n%d seconds to respond!\n\n", CFG.iPageLength);
|
||
|
fprintf(pWritingDevice, "%s\n", temp);
|
||
|
iOpenDevice = TRUE;
|
||
|
}
|
||
|
|
||
|
colour(9, 0);
|
||
|
for(i = 0; i < CFG.iPageLength; i++) {
|
||
|
printf("\x07");
|
||
|
/* If there weren't any problems opening the writing device */
|
||
|
if(iOpenDevice)
|
||
|
fprintf(pWritingDevice, "\x07");
|
||
|
printf("%c", 219);
|
||
|
fflush(pWritingDevice);
|
||
|
fflush(stdout);
|
||
|
sleep(1);
|
||
|
if(access("/tmp/chatdev", R_OK) == 0) {
|
||
|
fclose(pWritingDevice);
|
||
|
Chat();
|
||
|
free(Reason);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fclose(pWritingDevice);
|
||
|
PageReason();
|
||
|
printf("\n\n\n");
|
||
|
if (strlen(Reason))
|
||
|
SysopComment(Reason);
|
||
|
else
|
||
|
SysopComment((char *)"Failed chat");
|
||
|
}
|
||
|
|
||
|
free(Reason);
|
||
|
Pause();
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Function gets string from user for Pager Function
|
||
|
*/
|
||
|
void GetPageStr(char *sStr, int iMaxlen)
|
||
|
{
|
||
|
unsigned char ch = 0;
|
||
|
int iPos = 0;
|
||
|
|
||
|
if ((ttyfd = open ("/dev/tty", O_RDWR)) < 0) {
|
||
|
perror("open 6");
|
||
|
return;
|
||
|
}
|
||
|
Setraw();
|
||
|
|
||
|
strcpy(sStr, "");
|
||
|
|
||
|
alarm_on();
|
||
|
while (ch != 13) {
|
||
|
ch = Readkey();
|
||
|
|
||
|
if (((ch == 8) || (ch == KEY_DEL) || (ch == 127)) && (iPos > 0)) {
|
||
|
printf("\b%c\b", 250);
|
||
|
fflush(stdout);
|
||
|
sStr[--iPos]='\0';
|
||
|
}
|
||
|
|
||
|
if (ch > 31 && ch < 127) {
|
||
|
if (iPos <= iMaxlen) {
|
||
|
iPos++;
|
||
|
sprintf(sStr, "%s%c", sStr, ch);
|
||
|
printf("%c", ch);
|
||
|
fflush(stdout);
|
||
|
} else
|
||
|
ch=13;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Unsetraw();
|
||
|
close(ttyfd);
|
||
|
printf("\n");
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Function gets page reason from a file in the txtfiles directory
|
||
|
* randomly generates a number and prints the string to the screen
|
||
|
*/
|
||
|
void PageReason()
|
||
|
{
|
||
|
FILE *Page;
|
||
|
int iLoop = FALSE, id, i, j = 0;
|
||
|
int Lines = 0, Count = 0, iFoundString = FALSE;
|
||
|
char *String;
|
||
|
char *temp;
|
||
|
|
||
|
temp = calloc(128, sizeof(char));
|
||
|
String = calloc(81, sizeof(char));
|
||
|
|
||
|
sprintf(temp, "%s/page.asc", CFG.bbs_txtfiles);
|
||
|
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);
|
||
|
locate(18, ((78 - strlen(String) ) / 2));
|
||
|
pout(15, 0, (char *)"[");
|
||
|
pout(9, 0, String);
|
||
|
pout(15, 0, (char *)"]");
|
||
|
iFoundString = TRUE;
|
||
|
}
|
||
|
|
||
|
Lines++; /* Increment Lines until correct line is found */
|
||
|
}
|
||
|
} /* End of Else */
|
||
|
|
||
|
if(!iFoundString) {
|
||
|
/* Sysop currently is not available ... please leave a comment */
|
||
|
sprintf(String, "%s", (char *) Language(155));
|
||
|
locate(18, ((78 - strlen(String) ) / 2));
|
||
|
pout(15, 0, (char *)"[");
|
||
|
pout(9, 0, String);
|
||
|
pout(15, 0, (char *)"]");
|
||
|
}
|
||
|
|
||
|
free(temp);
|
||
|
free(String);
|
||
|
}
|
||
|
|