/*
Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
*/
/* configure all options BEFORE including system stuff. */
#include "config.h"
#include "mud.h"
#include "vars.h"
static int deletepost(char *who, char *aswho, int num);
static int post(char *who, char *message);
static int deletepost (who, aswho, num)
char *who;
char *aswho;
int num;
{
char nfbuf[640];
if (!ut_flagged (aswho, var_wiz)) {
say (who, "Only a wizard can delete a news item.\n", (char *) 0);
return (UERR_PERM);
}
(void) sprintf (nfbuf, "NEWS/%d", num);
if (unlink (nfbuf)) {
say (who, "Could not delete news item!\n", (char *) 0);
return (UERR_FATAL);
}
say (who, "Deleted.\n", (char *) 0);
return (UERR_NONE);
}
static int post (who, message)
char *who;
char *message;
{
FILE *fp;
int newart;
char nfbuf[640];
time_t now;
extern char *ctime ();
/* access and increment the system top article ID */
if (ut_getnum (system_object, var_newsart, &newart))
newart = 0;
newart = newart + 1;
/* try to open the file for output */
(void) sprintf (nfbuf, "NEWS/%d", newart);
if ((fp = fopen (nfbuf, "wb")) == (FILE *) 0) {
say (who, "Cannot create new article\n", (char *) 0);
return (UERR_FATAL);
}
/* if the file open worked, increment the system article count. */
if (ut_setnum (who, system_object, var_newsart, newart)) {
(void) fclose (fp);
(void) unlink (nfbuf);
say (who, "System error. Could not post.\n", (char *) 0);
return (UERR_FATAL);
}
/* we now have the article # and the file open. go for it. */
(void) time (&now);
/* Grod, die. */
if (message[0] == '#')
message[0] = ' ';
/* naughty, naughty */
(void) fprintf (fp, " -- Article #%d, posted by %s(%s), %s%s\n",
newart, ut_name (who), who, ctime (&now), message);
(void) fclose (fp);
say (who, "Posted.\n", (char *) 0);
return (UERR_NONE);
}
/* ARGSUSED */
int cmd_NEWS (int argc, char *argv[], char *who, char *aswho)
{
int anum;
int nnum;
int topart;
char *ap;
char nfbuf[640];
char nxbuf[64];
int setflg = 0;
if ((ap =
ut_getatt (who, 0, typ_int, var_newsart, (char *) 0)) != (char *) 0)
anum = atoi (ap);
else
anum = 0;
if (argc == 1)
nnum = anum + 1, setflg++;
else if (argc == 2 && !strncmp (argv[1], "next", strlen (argv[1])))
nnum = anum + 1, setflg++;
else if (argc == 2 && !strncmp (argv[1], "previous", strlen (argv[1])))
nnum = anum - 1;
else if (argc >= 2 && !strncmp (argv[1], "post", strlen (argv[1]))) {
if (strcmp (who, aswho)) {
say (who, "sorry. can't post NEWS for someone\n", (char *) 0);
return (UERR_PERM);
}
if (argc != 3) {
say (who, "Usage: ", argv[0], " post message-text\n", (char *) 0);
return (UERR_BADPARM);
}
return (post (who, argv[2]));
} else if (argc >= 2 && !strncmp (argv[1], "goto", strlen (argv[1]))) {
if (argc != 3) {
say (who, "Usage: ", argv[0], " goto message-number\n", (char *) 0);
return (UERR_BADPARM);
}
nnum = atoi (argv[2]);
setflg++;
} else if (argc >= 2 && !strncmp (argv[1], "delete", strlen (argv[1]))) {
if (argc != 3) {
say (who, "Usage: ", argv[0], " delete message-number\n", (char *) 0);
return (UERR_BADPARM);
}
nnum = atoi (argv[2]);
return (deletepost (who, aswho, nnum));
} else if (argc == 2 && isdigit (argv[1][0]))
nnum = atoi (argv[1]);
else {
say (who, argv[0], " [next]\n", (char *) 0);
say (who, argv[0], " previous\n", (char *) 0);
say (who, argv[0], " post message-text\n", (char *) 0);
say (who, argv[0], " delete message-number\n", (char *) 0);
say (who, argv[0], " [goto] message-number\n", (char *) 0);
return (UERR_NONE);
}
if (nnum <= 0) {
say (who, itoa (nnum, nxbuf, 10), " isn't a valid article.\n",
(char *) 0);
return (UERR_BADOID);
}
if (ut_getnum (system_object, var_newsart, &topart)) {
say (who, "There's no news.\n", (char *) 0);
return (UERR_NONE);
}
do {
(void) sprintf (nfbuf, "NEWS/%d", nnum);
if (say_file (who, nfbuf)) {
say (who, "no article ", itoa (nnum, nxbuf, 10), "\n", (char *) 0);
nnum++;
} else {
say (who, " -- End Article ", itoa (nnum, nxbuf, 10), "\n", (char *) 0);
break;
}
} while (nnum <= topart && setflg);
nnum = (nnum > topart ? topart : nnum);
/* update ".newsrc" */
if (setflg) {
if (ut_set (who, who, typ_int, var_newsart, itoa (nnum, nxbuf, 10)))
return (UERR_FATAL);
}
return (UERR_NONE);
}