diff options
Diffstat (limited to 'FICS/comproc.c.orig')
-rw-r--r-- | FICS/comproc.c.orig | 1625 |
1 files changed, 0 insertions, 1625 deletions
diff --git a/FICS/comproc.c.orig b/FICS/comproc.c.orig deleted file mode 100644 index 2ec74e3..0000000 --- a/FICS/comproc.c.orig +++ /dev/null @@ -1,1625 +0,0 @@ -/* comproc.c - * - */ - -/* - fics - An internet chess server. - Copyright (C) 1993 Richard V. Nash - - This program 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 of the License, or - (at your option) any later version. - - This program 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. -*/ - -/* Revision history: - name email yy/mm/dd Change - Richard Nash 93/10/22 Created - foxbat 95/03/11 added filters in cmatch. -*/ - -#include "stdinclude.h" - -#include "common.h" -#include "talkproc.h" -#include "comproc.h" -#include "command.h" -#include "utils.h" -#include "ficsmain.h" -#include "config.h" -#include "playerdb.h" -#include "network.h" -#include "rmalloc.h" -#include "channel.h" -#include "variable.h" -#include "gamedb.h" -#include "gameproc.h" -#include "board.h" -/* #include "hostinfo.h" */ -#include "multicol.h" -#include "ratings.h" -#include "formula.h" -#include "lists.h" -#include "eco.h" -#include "network.h" -#include <string.h> - -#include <sys/resource.h> - -/* grimm */ -#if defined(SGI) -#else -/* int system(char *arg); */ -#endif - -const none = 0; -const blitz_rat = 1; -const std_rat = 2; -const wild_rat = 3; - - -PUBLIC int com_rating_recalc(int p, param_list param) -{ - ASSERT(parray[p].adminLevel >= ADMIN_ADMIN); - rating_recalc(); - return COM_OK; -} - -PUBLIC int com_more(int p, param_list param) -{ -/* in_push(IN_HELP); */ - pmore_file(p); - return COM_OK; -} - -PUBLIC int num_news = -1; - -PUBLIC int com_news(int p, param_list param) -{ - FILE *fp; - char filename[MAX_FILENAME_SIZE]; - char junk[MAX_LINE_SIZE]; - char *junkp; - int crtime, found = 0; - char count[10]; - - if (num_news == -1) { - sprintf(filename, "%s/news.index", news_dir); - fp = fopen(filename, "r"); - if (!fp) { - fprintf(stderr, "Cant find news index.\n"); - return COM_OK; - } - num_news = count_lines(fp); - fclose(fp); /* It's customary to close files after use! */ - } - - if (param[0].type == 0) { - /* no params - then just display index over news */ - sprintf(filename, "%s/news.index", news_dir); - fp = fopen(filename, "r"); - if (!fp) { - fprintf(stderr, "Can't find news index.\n"); - return COM_OK; - } - pprintf(p,"Index of recent news items:\n"); - while (!feof(fp)) { - junkp = junk; - fgets(junk, MAX_LINE_SIZE, fp); - if (feof(fp)) - break; - if (strlen(junk) > 1) { - sscanf(junkp, "%d %s", &crtime, count); - if (atoi(count) > num_news - 10) { - junkp = nextword(junkp); - junkp = nextword(junkp); - pprintf(p, "%3s (%s) %s", count, strltime(&crtime), junkp); - } - } - } - fclose(fp); - } else if ((param[0].type == TYPE_WORD) && !strcmp(param[0].val.word, "all")) { - /* param all - displays all news items */ - sprintf(filename, "%s/news.index", news_dir); - fp = fopen(filename, "r"); - if (!fp) { - fprintf(stderr, "Can't find news index.\n"); - return COM_OK; - } - pprintf(p, "Index of all news items:\n"); - while (!feof(fp)) { - junkp = junk; - fgets(junk, MAX_LINE_SIZE, fp); - if (feof(fp)) - break; - if (strlen(junk) > 1) { - sscanf(junkp, "%d %s", &crtime, count); - junkp = nextword(junkp); - junkp = nextword(junkp); - pprintf(p, "%3s (%s) %s", count, strltime(&crtime), junkp); - } - } - fclose(fp); /* It's customary to close files after use! */ - } else { /* check if the specific news file exist in index */ - sprintf(filename, "%s/news.index", news_dir); - fp = fopen(filename, "r"); - if (!fp) { - fprintf(stderr, "Can't find news index.\n"); - return COM_OK; - } - while (!feof(fp) && !found) { - junkp = junk; - fgets(junk, MAX_LINE_SIZE, fp); - if (feof(fp)) - break; - if (strlen(junk) > 1) { - sscanf(junkp, "%d %s", &crtime, count); - if (!strcmp(count, param[0].val.word)) { - found = 1; - junkp = nextword(junkp); - junkp = nextword(junkp); - pprintf(p, "NEWS %3s (%s) %s\n", count, strltime(&crtime), junkp); - } - } - } - fclose(fp); - if (!found) { - pprintf(p, "Bad index number!\n"); - return COM_OK; - } - /* file exists - show it */ - sprintf(filename, "%s/news.%s", news_dir, param[0].val.word); - fp = fopen(filename, "r"); - if (!fp) { - pprintf(p, "No more info.\n"); - return COM_OK; - } - fclose(fp); - sprintf(filename, "news.%s", param[0].val.word); - if (psend_file(p, news_dir, filename) < 0) { - pprintf(p, "Internal error - couldn't send news file!\n"); - } - } - return COM_OK; -} - -PUBLIC int com_quit(int p, param_list param) -{ - if ((parray[p].game >= 0) && (garray[parray[p].game].status == GAME_EXAMINE)) { - pcommand(p, "unexamine"); - } - - if (parray[p].game >= 0) { - pprintf(p, "You can't quit while you are playing a game.\nType 'resign' to resign the game, or you can request an abort with 'abort'.\n"); - return COM_OK; - } - psend_logoutfile(p, mess_dir, MESS_LOGOUT); - return COM_LOGOUT; -} - -PUBLIC int com_set(int p, param_list param) -{ - int result; - int which; - char *val; - - if (param[1].type == TYPE_NULL) - val = NULL; - else - val = param[1].val.string; - result = var_set(p, param[0].val.word, val, &which); - switch (result) { - case VAR_OK: - break; - case VAR_BADVAL: - pprintf(p, "Bad value given for variable %s.\n", param[0].val.word); - break; - case VAR_NOSUCH: - pprintf(p, "No such variable name %s.\n", param[0].val.word); - break; - case VAR_AMBIGUOUS: - pprintf(p, "Ambiguous variable name %s.\n", param[0].val.word); - break; - } - player_save(p); - return COM_OK; -} - -PUBLIC int FindPlayer(int p, parameter * param, int *p1, int *connected) -{ - if (param->type == TYPE_WORD) { - *p1 = player_search(p, param->val.word); - if (*p1 == 0) - return 0; - if (*p1 < 0) { /* player had to be connected and will be - removed later */ - *connected = 0; - *p1 = (-*p1) - 1; - } else { - *connected = 1; - *p1 = *p1 - 1; - } - } else { - *p1 = p; - *connected = 1; - } - return 1; -} - -PRIVATE void com_stats_andify(int *numbers, int howmany, char *dest) -{ - char tmp[10]; - - *dest = '\0'; - while (howmany--) { - sprintf(tmp, "%d", numbers[howmany]); - strcat(dest, tmp); - if (howmany > 1) - sprintf(tmp, ", "); - else if (howmany == 1) - sprintf(tmp, " and "); - else - sprintf(tmp, ".\n"); - strcat(dest, tmp); - } - return; -} - -PRIVATE void com_stats_rating(char *hdr, statistics * stats, char *dest) -{ - char tmp[100]; - - sprintf(dest, "%-10s%4s %5.1f %4d %4d %4d %4d", - hdr, ratstr(stats->rating), stats->sterr, stats->win, stats->los, stats->dra, stats->num); - if (stats->whenbest) { - sprintf(tmp, " %d", stats->best); - strcat(dest, tmp); - strftime(tmp, sizeof(tmp), " (%d-%b-%y)", localtime((time_t *) & stats->whenbest)); - strcat(dest, tmp); - } - strcat(dest, "\n"); - return; -} - -PUBLIC int com_stats(int p, param_list param) -{ - int g, i, t; - int p1, connected; - char line[255], tmp[255]; - int numbers[MAX_OBSERVE > MAX_SIMUL ? MAX_OBSERVE : MAX_SIMUL]; - int days, hours, mins, secs, onTime; - - if (!FindPlayer(p, ¶m[0], &p1, &connected)) - return COM_OK; - - sprintf(line, "\nStatistics for %-11s ", parray[p1].name); - if ((connected) && (parray[p1].status == PLAYER_PROMPT)) { - sprintf(tmp, "On for: %s", hms(player_ontime(p1), 0, 0, 0)); - strcat(line, tmp); - sprintf(tmp, " Idle: %s\n", hms(player_idle(p1), 0, 0, 0)); - } else { - if ((t = player_lastdisconnect(p1))) - sprintf(tmp, "(Last disconnected %s):\n", strltime(&t)); - else - sprintf(tmp, "(Never connected.)\n"); - } - strcat(line, tmp); - pprintf(p, "%s", line); - if (parray[p1].simul_info.numBoards) { - for (i = 0, t = 0; i < parray[p1].simul_info.numBoards; i++) { - if ((numbers[t] = parray[p1].simul_info.boards[i] + 1) != 0) - t++; - } - pprintf(p, "%s is giving a simul: game%s ", parray[p1].name, ((t > 1) ? "s" : "")); - com_stats_andify(numbers, t, tmp); - pprintf(p, tmp); - } else if (parray[p1].game >= 0) { - g = parray[p1].game; - if (garray[g].status == GAME_EXAMINE) { - pprintf(p, "(Examining game %d: %s vs. %s)\n", g + 1, - garray[g].white_name, garray[g].black_name); - } else { - pprintf(p, "(playing game %d: %s vs. %s)\n", g + 1, - parray[garray[g].white].name, parray[garray[g].black].name); - } - } - if (parray[p1].num_observe) { - for (i = 0, t = 0; i < parray[p1].num_observe; i++) { - g = parray[p1].observe_list[i]; - if ((g != -1) && ((parray[p].adminLevel >= ADMIN_ADMIN) || (garray[g].private == 0))) - numbers[t++] = g + 1; - } - if (t) { - pprintf(p, "%s is observing game%s ", parray[p1].name, ((t > 1) ? "s" : "")); - com_stats_andify(numbers, t, tmp); - pprintf(p, tmp); - } - } - if (parray[p1].busy[0]) { - pprintf(p, "(%s %s)\n", parray[p1].name, parray[p1].busy); - } - if (!parray[p1].registered) { - pprintf(p, "%s is NOT a registered player.\n\n", parray[p1].name); - } else { - pprintf(p, "\n rating RD win loss draw total best\n"); - com_stats_rating("Blitz", &parray[p1].b_stats, tmp); - pprintf(p, tmp); - com_stats_rating("Standard", &parray[p1].s_stats, tmp); - pprintf(p, tmp); - com_stats_rating("Wild", &parray[p1].w_stats, tmp); - pprintf(p, tmp); - } - pprintf(p, "\n"); - if (parray[p1].adminLevel > 0) { - pprintf(p, "Admin Level: "); - switch (parray[p1].adminLevel) { -/* - case 0: - pprintf(p, "Normal User\n"); - break; - case 5: - pprintf(p, "Extra Cool User\n"); vek wants to be 5 - break; - - Forget it - you can do some admin stuff if your level is > than 0 - DAV - -*/ - case 5: - pprintf(p, "Authorized Helper Person\n"); - break; - case 10: - pprintf(p, "Administrator\n"); - break; - case 15: - pprintf(p, "Help File Librarian/Administrator\n"); - break; - case 20: - pprintf(p, "Master Administrator\n"); - break; - case 50: - pprintf(p, "Master Help File Librarian/Administrator\n"); - break; - case 60: - pprintf(p, "Assistant Super User\n"); - break; - case 100: - pprintf(p, "Super User\n"); - break; - default: - pprintf(p, "%d\n", parray[p1].adminLevel); - break; - } - } - if (parray[p].adminLevel > 0) - pprintf(p, "Full Name : %s\n", (parray[p1].fullName ? parray[p1].fullName : "(none)")); - if (((p1 == p) && (parray[p1].registered)) || (parray[p].adminLevel > 0)) - pprintf(p, "Address : %s\n", (parray[p1].emailAddress ? parray[p1].emailAddress : "(none)")); - if (parray[p].adminLevel > 0) { - pprintf(p, "Host : %s\n", -/* - ((hp = gethostbyaddr((const char*) (connected ? &parray[p1].thisHost : &parray[p1].lastHost), sizeof(parray[p1].thisHost), AF_INET)) == 0) ? "" : hp->h_name, -*/ - dotQuad(connected ? parray[p1].thisHost : parray[p1].lastHost)); - } - if ((parray[p].adminLevel > 0) && (parray[p1].registered)) - if (parray[p1].num_comments) - pprintf(p, "Comments : %d\n", parray[p1].num_comments); - - if (connected && parray[p1].registered && (p==p1 || - (parray[p].adminLevel > 0))) { - char *timeToStr = ctime((time_t *) &parray[p1].timeOfReg); - - timeToStr[strlen(timeToStr)-1]='\0'; - pprintf(p, "\n"); - onTime = (time(0) - parray[p1].logon_time) + parray[p1].totalTime; - days = (onTime / (60*60*24)); - hours = ((onTime % (60*60*24)) / (60*60)); - mins = (((onTime % (60*60*24)) % (60*60)) / 60); - secs = (((onTime % (60*60*24)) % (60*60)) % 60); - if ((days==0) && (hours==0) && (mins==0)) { - pprintf(p, "Total time on-line: %d second%s\n", - secs, (secs==1) ? "" : "s"); - } else if ((days==0) && (hours==0)) { - pprintf(p, "Total time on-line: %d minute%s and %d second%s\n", - mins, (mins==1) ? "" : "s", - secs, (secs==1) ? "" : "s"); - } else if (days==0) { - pprintf(p, "Total time on-line: %d hour%s, %d minute%s and %d " - "second%s\n", - hours, (hours==1) ? "" : "s", - mins, (mins==1) ? "" : "s", - secs, (secs==1) ? "" : "s"); - } else { - pprintf(p, "Total time on-line: %d day%s, %d hour%s, %d minute%s " - "and %d second%s\n", - days, (days==1) ? "" : "s", - hours, (hours==1) ? "" : "s", - mins, (mins==1) ? "" : "s", - secs, (secs==1) ? "" : "s"); - } - pprintf(p, "%% of life on-line: %3.1f (since %s)\n", - (double)((onTime*100)/(double)(time(0)-parray[p1].timeOfReg)), - timeToStr); - } - -#ifdef TIMESEAL - - if (connected) - pprintf(p, "\nTimeseal : %s\n", (con[parray[p1].socket].timeseal) -? "On" : "Off"); - if ((parray[p].adminLevel > 0) && (connected)) { - if (findConnection(parray[p1].socket)) { - pprintf(p, "Unix acc : %s\nSystem/OS : %s\n", - con[parray[p1].socket].user, - con[parray[p1].socket].sys); - } - } - -#endif - - if (parray[p1].num_plan) { - pprintf(p, "\n"); - for (i = 0; i < parray[p1].num_plan; i++) - pprintf(p, "%2d: %s\n", i + 1, (parray[p1].planLines[i] != NULL) ? parray[p1].planLines[i] : ""); - } - if (!connected) - player_remove(p1); - return COM_OK; -} - -PUBLIC int com_variables(int p, param_list param) -{ - int p1, connected; - int i; - - if (!FindPlayer(p, ¶m[0], &p1, &connected)) - return COM_OK; - - pprintf(p, "Variable settings of %s:\n", parray[p1].name); -/* if (parray[p1].fullName) - pprintf(p, " Realname: %s\n", parray[p1].fullName); -*/ - if (parray[p1].uscfRating) - pprintf(p, " USCF: %d\n", parray[p1].uscfRating); - pprintf(p, " time=%-3d inc=%-3d private=%d Lang=%s\n", - parray[p1].d_time, parray[p1].d_inc, parray[p1].private, - Language(parray[p1].language)); - pprintf(p, " rated=%d ropen=%d open=%d simopen=%d\n", - parray[p1].rated, parray[p1].ropen, parray[p1].open, parray[p1].sopen); - pprintf(p, " shout=%d cshout=%d kib=%d tell=%d notifiedby=%d\n", - parray[p1].i_shout, parray[p1].i_cshout, parray[p1].i_kibitz, parray[p1].i_tell, parray[p1].notifiedby); - pprintf(p, " pin=%d gin=%d style=%-3d flip=%d\n", - parray[p1].i_login, parray[p1].i_game, parray[p1].style + 1, parray[p1].flip); - pprintf(p, " highlight=%d bell=%d auto=%d mailmess=%d pgn=%d\n", - parray[p1].highlight, parray[p1].bell, parray[p1].automail, parray[p1].i_mailmess, parray[p1].pgn); - pprintf(p, " width=%-3d height=%-3d\n", - parray[p1].d_width, parray[p1].d_height); - if (parray[p1].prompt && parray[p1].prompt != def_prompt) - pprintf(p, " Prompt: %s\n", parray[p1].prompt); - - { /* added code to print channels */ - int count = 0; - for (i = 0; i < MAX_CHANNELS; i++) { - if (on_channel(i, p1)) { - if (!count) - pprintf(p, "\n Channels:"); - pprintf(p, " %d", i); - count++; - } - } - if (count) - pprintf(p, "\n"); - } -/* if (parray[p1].numAlias && (p == p1)) { - pprintf(p, "\n Aliases:\n"); - for (i = 0; i < parray[p1].numAlias; i++) { - pprintf(p, " %s %s\n", parray[p1].alias_list[i].comm_name, - parray[p1].alias_list[i].alias); - } - } -*/ - if (parray[p1].num_formula) { - pprintf(p, "\n"); - for (i = 0; i < parray[p1].num_formula; i++) { - if (parray[p1].formulaLines[i] != NULL) - pprintf(p, " f%d: %s\n", i + 1, parray[p1].formulaLines[i]); - else - pprintf(p, " f%d:\n", i + 1); - } - } - if (parray[p1].formula != NULL) - pprintf(p, "\nFormula: %s\n", parray[p1].formula); - - if (!connected) - player_remove(p1); - return COM_OK; -} - -PUBLIC int com_password(int p, param_list param) -{ - char *oldpassword = param[0].val.word; - char *newpassword = param[1].val.word; - char salt[3]; - - if (!parray[p].registered) { - pprintf(p, "Setting a password is only for registered players.\n"); - return COM_OK; - } - if (parray[p].passwd) { - salt[0] = parray[p].passwd[0]; - salt[1] = parray[p].passwd[1]; - salt[2] = '\0'; - if (strcmp(crypt(oldpassword, salt), parray[p].passwd)) { - pprintf(p, "Incorrect password, password not changed!\n"); - return COM_OK; - } - rfree(parray[p].passwd); - parray[p].passwd = NULL; - } - salt[0] = 'a' + rand() % 26; - salt[1] = 'a' + rand() % 26; - salt[2] = '\0'; - parray[p].passwd = strdup(crypt(newpassword, salt)); - pprintf(p, "Password changed to \"%s\".\n", newpassword); - return COM_OK; -} - -PUBLIC int com_uptime(int p, param_list param) -{ - unsigned long uptime = time(0) - startuptime; - struct rusage ru; - int days = (uptime / (60*60*24)); - int hours = ((uptime % (60*60*24)) / (60*60)); - int mins = (((uptime % (60*60*24)) % (60*60)) / 60); - int secs = (((uptime % (60*60*24)) % (60*60)) % 60); - - pprintf(p, "Server location: %s Server version : %s\n", fics_hostname,VERS_NUM); - pprintf(p, "The server has been up since %s.\n", strltime(&startuptime)); - if ((days==0) && (hours==0) && (mins==0)) { - pprintf(p, "(Up for %d second%s)\n", - secs, (secs==1) ? "" : "s"); - } else if ((days==0) && (hours==0)) { - pprintf(p, "(Up for %d minute%s and %d second%s)\n", - mins, (mins==1) ? "" : "s", - secs, (secs==1) ? "" : "s"); - } else if (days==0) { - pprintf(p, "(Up for %d hour%s, %d minute%s and %d second%s)\n", - hours, (hours==1) ? "" : "s", - mins, (mins==1) ? "" : "s", - secs, (secs==1) ? "" : "s"); - } else { - pprintf(p, "(Up for %d day%s, %d hour%s, %d minute%s and %d second%s)\n", - days, (days==1) ? "" : "s", - hours, (hours==1) ? "" : "s", - mins, (mins==1) ? "" : "s", - secs, (secs==1) ? "" : "s"); - } - pprintf(p, "\nAllocs: %u Frees: %u Allocs In Use: %u\n", - malloc_count, free_count, malloc_count - free_count); - if (parray[p].adminLevel >= ADMIN_ADMIN) { - pprintf(p, "\nplayer size:%d, game size:%d, con size:%d, g_num:%d\n", - sizeof(player), sizeof(game), net_consize(), g_num); - getrusage(RUSAGE_SELF, &ru); - pprintf(p, "pagesize = %d, maxrss = %d, total = %d\n", getpagesize(), ru.ru_maxrss, getpagesize() * ru.ru_maxrss); - } - pprintf(p, "\nPlayer limit: %d\n", max_connections); - pprintf(p, "\nThere are currently %d players, with a high of %d since last restart.\n", player_count(), player_high); - pprintf(p, "There are currently %d games, with a high of %d since last restart.\n", game_count(), game_high); - pprintf(p, "\nCompiled on %s\n", COMP_DATE); - return COM_OK; -} - -PUBLIC int com_date(int p, param_list param) -{ - int t = time(0); - pprintf(p, "Local time - %s\n", strltime(&t)); - pprintf(p, "Greenwich time - %s\n", strgtime(&t)); - return COM_OK; -} - -char *inout_string[] = { - "login", "logout" -}; - -PRIVATE int plogins(p, fname) -int p; -char *fname; -{ - FILE *fp; - int inout, thetime, registered; - char loginName[MAX_LOGIN_NAME + 1]; - char ipstr[20]; - - fp = fopen(fname, "r"); - if (!fp) { - pprintf(p, "Sorry, no login information available.\n"); - return COM_OK; - } - while (!feof(fp)) { - if (fscanf(fp, "%d %s %d %d %s\n", &inout, loginName, &thetime, - ®istered, ipstr) != 5) { - fprintf(stderr, "FICS: Error in login info format. %s\n", fname); - fclose(fp); - return COM_OK; - } - pprintf(p, "%s: %-17s %-6s", strltime(&thetime), loginName, - inout_string[inout]); - if (parray[p].adminLevel > 0) { - pprintf(p, " from %s\n", ipstr); - } else - pprintf(p, "\n"); - } - fclose(fp); - return COM_OK; -} - -PUBLIC int com_llogons(int p, param_list param) -{ - char fname[MAX_FILENAME_SIZE]; - - sprintf(fname, "%s/%s", stats_dir, STATS_LOGONS); - return plogins(p, fname); -} - -PUBLIC int com_logons(int p, param_list param) -{ - char fname[MAX_FILENAME_SIZE]; - - if (param[0].type == TYPE_WORD) { - sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, param[0].val.word[0], param[0].val.word, STATS_LOGONS); - } else { - sprintf(fname, "%s/player_data/%c/%s.%s", stats_dir, parray[p].login[0], parray[p].login, STATS_LOGONS); - } - return plogins(p, fname); -} - -#define WHO_OPEN 0x01 -#define WHO_CLOSED 0x02 -#define WHO_RATED 0x04 -#define WHO_UNRATED 0x08 -#define WHO_FREE 0x10 -#define WHO_PLAYING 0x20 -#define WHO_REGISTERED 0x40 -#define WHO_UNREGISTERED 0x80 - -PRIVATE void who_terse(int p, int num, int *plist, int type) -{ - char ptmp[80 + 20]; /* for highlight */ - multicol *m = multicol_start(PARRAY_SIZE); - int i; - int p1; - int rat; - - /* altered DAV 3/15/95 */ - - for (i = 0; i < num; i++) { - p1 = plist[i]; - if (type == blitz_rat) - rat = parray[p1].b_stats.rating; - if (type == wild_rat) - rat = parray[p1].w_stats.rating; - if (type == std_rat) - rat = parray[p1].s_stats.rating; - - if (type == none) { - sprintf(ptmp, " "); - } else { - sprintf(ptmp, "%-4s", ratstrii(rat, parray[p1].registered)); - if (parray[p1].simul_info.numBoards) { - strcat(ptmp, "~"); - } else if ((parray[p1].game >= 0) && (garray[parray[p1].game].status == GAME_EXAMINE)) { - strcat(ptmp, "#"); - } else if (parray[p1].game >= 0) { - strcat(ptmp, "^"); - } else if (!parray[p1].open) { - strcat(ptmp, ":"); - } else if (player_idle(p1) > 300) { - strcat(ptmp, "."); - } else { - strcat(ptmp, " "); - } - } - if (p == p1) { - psprintf_highlight(p, ptmp + strlen(ptmp), "%s", parray[p1].name); - } else { - strcat(ptmp, parray[p1].name); - } - if ((parray[p1].adminLevel >= 10) && (parray[p1].i_admin)) - strcat(ptmp, "(*)"); - if (in_list("computer", parray[p1].name)) - strcat(ptmp, "(C)"); -/* grimm's fishlist - if (in_list("fish", parray[p1].name)) strcat(ptmp, "(Fish)"); -*/ - if (in_list("fm", parray[p1].name)) - strcat(ptmp, "(FM)"); - if (in_list("im", parray[p1].name)) - strcat(ptmp, "(IM)"); - if (in_list("gm", parray[p1].name)) - strcat(ptmp, "(GM)"); - if (in_list("td", parray[p1].name)) - strcat(ptmp, "(TD)"); - multicol_store(m, ptmp); - } - multicol_pprint(m, p, 80, 2); - multicol_end(m); - pprintf(p, "\n %d Players displayed (of %d). (*) indicates system administrator.\n", num, player_count()); -} - -PRIVATE void who_verbose(p, num, plist) -int p; -int num; -int plist[]; -{ - int i, p1; - char playerLine[255], tmp[255]; /* +8 for highlight */ - - pprintf(p, - " +---------------------------------------------------------------+\n" - ); - pprintf(p, - " | User Standard Blitz On for Idle |\n" - ); - pprintf(p, - " +---------------------------------------------------------------+\n" - ); - - for (i = 0; i < num; i++) { - p1 = plist[i]; - - strcpy(playerLine, " |"); - - if (parray[p1].game >= 0) - sprintf(tmp, "%3d", parray[p1].game + 1); - else - sprintf(tmp, " "); - strcat(playerLine, tmp); - - if (!parray[p1].open) - sprintf(tmp, "X"); - else - sprintf(tmp, " "); - strcat(playerLine, tmp); - - if (parray[p1].registered) - if (parray[p1].rated) { - sprintf(tmp, " "); - } else { - sprintf(tmp, "u"); - } - else - sprintf(tmp, "U"); - strcat(playerLine, tmp); - - /* Modified by DAV 3/15/95 */ - if (p == p1) { - strcpy(tmp, " "); - psprintf_highlight(p, tmp + strlen(tmp), "%-17s", parray[p1].name); - } else { - sprintf(tmp, " %-17s", parray[p1].name); - } - strcat(playerLine, tmp); - - sprintf(tmp, " %4s %-4s %5s ", - ratstrii(parray[p1].s_stats.rating, parray[p1].registered), - ratstrii(parray[p1].b_stats.rating, parray[p1].registered), - hms(player_ontime(p1), 0, 0, 0)); - strcat(playerLine, tmp); - - if (player_idle(p1) >= 60) { - sprintf(tmp, "%5s |\n", hms(player_idle(p1), 0, 0, 0)); - } else { - sprintf(tmp, " |\n"); - } - strcat(playerLine, tmp); - pprintf(p, "%s", playerLine); - } - - pprintf(p, - " | |\n" - ); - pprintf(p, - " | %3d Players Displayed |\n", - num - ); - pprintf(p, - " +---------------------------------------------------------------+\n" - ); -} - -PRIVATE void who_winloss(p, num, plist) -int p; -int num; -int plist[]; -{ - int i, p1; - char playerLine[255], tmp[255]; /* for highlight */ - - pprintf(p, - "Name Stand win loss draw Blitz win loss draw idle\n" - ); - pprintf(p, - "---------------- ----- ------------- ----- ------------- ----\n" - ); - - for (i = 0; i < num; i++) { - p1 = plist[i]; - if (p1 == p) { - psprintf_highlight(p, playerLine, "%-17s", parray[p1].name); - } else { - sprintf(playerLine, "%-17s", parray[p1].name); - } - sprintf(tmp, " %4s %4d %4d %4d ", - ratstrii(parray[p1].s_stats.rating, parray[p1].registered), - (int) parray[p1].s_stats.win, - (int) parray[p1].s_stats.los, - (int) parray[p1].s_stats.dra); - strcat(playerLine, tmp); - - sprintf(tmp, "%4s %4d %4d %4d ", - ratstrii(parray[p1].b_stats.rating, parray[p1].registered), - (int) parray[p1].b_stats.win, - (int) parray[p1].b_stats.los, - (int) parray[p1].b_stats.dra); - strcat(playerLine, tmp); - - if (player_idle(p1) >= 60) { - sprintf(tmp, "%5s\n", hms(player_idle(p1), 0, 0, 0)); - } else { - sprintf(tmp, " \n"); - } - strcat(playerLine, tmp); - - pprintf(p, "%s", playerLine); - } - pprintf(p, " %3d Players Displayed.\n", num); -} - -PRIVATE int who_ok(p, sel_bits) -int p; -unsigned int sel_bits; -{ - if (parray[p].status != PLAYER_PROMPT) - return 0; - if (sel_bits == 0xff) - return 1; - if (sel_bits & WHO_OPEN) - if (!parray[p].open) - return 0; - if (sel_bits & WHO_CLOSED) - if (parray[p].open) - return 0; - if (sel_bits & WHO_RATED) - if (!parray[p].rated) - return 0; - if (sel_bits & WHO_UNRATED) - if (parray[p].rated) - return 0; - if (sel_bits & WHO_FREE) - if (parray[p].game >= 0) - return 0; - if (sel_bits & WHO_PLAYING) - if (parray[p].game < 0) - return 0; - if (sel_bits & WHO_REGISTERED) - if (!parray[p].registered) - return 0; - if (sel_bits & WHO_UNREGISTERED) - if (parray[p].registered) - return 0; - return 1; -} - - -PRIVATE int blitz_cmp(const void *pp1, const void *pp2) -{ - register int p1 = *(int *) pp1; - register int p2 = *(int *) pp2; - if (parray[p1].status != PLAYER_PROMPT) { - if (parray[p2].status != PLAYER_PROMPT) - return 0; - else - return -1; - } - if (parray[p2].status != PLAYER_PROMPT) - return 1; - if (parray[p1].b_stats.rating > parray[p2].b_stats.rating) - return -1; - if (parray[p1].b_stats.rating < parray[p2].b_stats.rating) - return 1; - if (parray[p1].registered > parray[p2].registered) - return -1; - if (parray[p1].registered < parray[p2].registered) - return 1; - return strcmp(parray[p1].login, parray[p2].login); -} - -PRIVATE int stand_cmp(const void *pp1, const void *pp2) -{ - register int p1 = *(int *) pp1; - register int p2 = *(int *) pp2; - if (parray[p1].status != PLAYER_PROMPT) { - if (parray[p2].status != PLAYER_PROMPT) - return 0; - else - return -1; - } - if (parray[p2].status != PLAYER_PROMPT) - return 1; - if (parray[p1].s_stats.rating > parray[p2].s_stats.rating) - return -1; - if (parray[p1].s_stats.rating < parray[p2].s_stats.rating) - return 1; - if (parray[p1].registered > parray[p2].registered) - return -1; - if (parray[p1].registered < parray[p2].registered) - return 1; - return strcmp(parray[p1].login, parray[p2].login); -} - -PRIVATE int wild_cmp(const void *pp1, const void *pp2) -{ - register int p1 = *(int *) pp1; - register int p2 = *(int *) pp2; - if (parray[p1].status != PLAYER_PROMPT) { - if (parray[p2].status != PLAYER_PROMPT) - return 0; - else - return -1; - } - if (parray[p2].status != PLAYER_PROMPT) - return 1; - if (parray[p1].w_stats.rating > parray[p2].w_stats.rating) - return -1; - if (parray[p1].w_stats.rating < parray[p2].w_stats.rating) - return 1; - if (parray[p1].registered > parray[p2].registered) - return -1; - if (parray[p1].registered < parray[p2].registered) - return 1; - return strcmp(parray[p1].login, parray[p2].login); -} - -PRIVATE int alpha_cmp(const void *pp1, const void *pp2) -{ - register int p1 = *(int *) pp1; - register int p2 = *(int *) pp2; - if (parray[p1].status != PLAYER_PROMPT) { - if (parray[p2].status != PLAYER_PROMPT) - return 0; - else - return -1; - } - if (parray[p2].status != PLAYER_PROMPT) - return 1; - return strcmp(parray[p1].login, parray[p2].login); -} - -PUBLIC void sort_players(int players[PARRAY_SIZE], - int ((*cmp_func) (const void *, const void *))) -{ - int i; - - for (i = 0; i < p_num; i++) { - players[i] = i; - } - qsort(players, p_num, sizeof(int), cmp_func); -} - -/* This is the of the most compliclicated commands in terms of parameters */ -PUBLIC int com_who(int p, param_list param) -{ - int style = 0; - float stop_perc = 1.0; - float start_perc = 0; - unsigned int sel_bits = 0xff; - int sortlist[PARRAY_SIZE], plist[PARRAY_SIZE]; - int ((*cmp_func) (const void *, const void *)) = blitz_cmp; - int startpoint; - int stoppoint; - int i, len; - int tmpI, tmpJ; - char c; - int p1, count, num_who; - int sort_type = blitz_rat; - - if (param[0].type == TYPE_WORD) { - len = strlen(param[0].val.word); - for (i = 0; i < len; i++) { - c = param[0].val.word[i]; - if (isdigit(c)) { - if (i == 0 || !isdigit(param[0].val.word[i - 1])) { - tmpI = c - '0'; - if (tmpI == 1) { - start_perc = 0.0; - stop_perc = 0.333333; - } else if (tmpI == 2) { - start_perc = 0.333333; - stop_perc = 0.6666667; - } else if (tmpI == 3) { - start_perc = 0.6666667; - stop_perc = 1.0; - } else if ((i == len - 1) || (!isdigit(param[0].val.word[i + 1]))) - return COM_BADPARAMETERS; - } else { - tmpI = c - '0'; - tmpJ = param[0].val.word[i - 1] - '0'; - if (tmpI == 0) - return COM_BADPARAMETERS; - if (tmpJ > tmpI) - return COM_BADPARAMETERS; - start_perc = ((float) tmpJ - 1.0) / (float) tmpI; - stop_perc = ((float) tmpJ) / (float) tmpI; - } - } else { - switch (c) { - case 'o': - if (sel_bits == 0xff) - sel_bits = WHO_OPEN; - else - sel_bits |= WHO_OPEN; - break; - case 'r': - if (sel_bits == 0xff) - sel_bits = WHO_RATED; - else - sel_bits |= WHO_RATED; - break; - case 'f': - if (sel_bits == 0xff) - sel_bits = WHO_FREE; - else - sel_bits |= WHO_FREE; - break; - case 'a': - if (sel_bits == 0xff) - sel_bits = WHO_FREE | WHO_OPEN; - else - sel_bits |= (WHO_FREE | WHO_OPEN); - break; - case 'R': - if (sel_bits == 0xff) - sel_bits = WHO_REGISTERED; - else - sel_bits |= WHO_REGISTERED; - break; - case 'l': /* Sort order */ - cmp_func = alpha_cmp; - sort_type = none; - break; - case 'A': /* Sort order */ - cmp_func = alpha_cmp; - break; - case 'w': /* Sort order */ - cmp_func = wild_cmp; - sort_type = wild_rat; - break; - case 's': /* Sort order */ - cmp_func = stand_cmp; - sort_type = std_rat; - break; - case 'b': /* Sort order */ - cmp_func = blitz_cmp; - sort_type = blitz_rat; - break; - case 't': /* format */ - style = 0; - break; - case 'v': /* format */ - style = 1; - break; - case 'n': /* format */ - style = 2; - break; - case 'U': - if (sel_bits == 0xff) - sel_bits = WHO_UNREGISTERED; - else - sel_bits |= WHO_UNREGISTERED; - break; - default: - return COM_BADPARAMETERS; - break; - } - } - } - } - sort_players(sortlist, cmp_func); - count = 0; - for (p1 = 0; p1 < p_num; p1++) { - if (!who_ok(sortlist[p1], sel_bits)) - continue; - count++; - } - startpoint = floor((float) count * start_perc); - stoppoint = ceil((float) count * stop_perc) - 1; - num_who = 0; - count = 0; - for (p1 = 0; p1 < p_num; p1++) { - if (!who_ok(sortlist[p1], sel_bits)) - continue; - if ((count >= startpoint) && (count <= stoppoint)) { - plist[num_who++] = sortlist[p1]; - } - count++; - } - if (num_who == 0) { - pprintf(p, "No logged in players match the flags in your who request.\n"); - return COM_OK; - } - switch (style) { - case 0: /* terse */ - who_terse(p, num_who, plist, sort_type); - break; - case 1: /* verbose */ - who_verbose(p, num_who, plist); - break; - case 2: /* win-loss */ - who_winloss(p, num_who, plist); - break; - default: - return COM_BADPARAMETERS; - break; - } - return COM_OK; -} - -PUBLIC int com_refresh(int p, param_list param) -{ - int g, p1; - - if (param[0].type == TYPE_NULL) { - if (parray[p].game >= 0) { - send_board_to(parray[p].game, p); - } else { /* Do observing in here */ - if (parray[p].num_observe) { - for (g = 0; g < parray[p].num_observe; g++) { - send_board_to(parray[p].observe_list[g], p); - } - } else { - pprintf(p, "You are neither playing, observing nor examining a game.\n"); - return COM_OK; - } - } - } else { - g = GameNumFromParam (p, &p1, ¶m[0]); - if (g < 0) - return COM_OK; - if ((g >= g_num) || ((garray[g].status != GAME_ACTIVE) - && (garray[g].status != GAME_EXAMINE))) { - pprintf(p, "No such game.\n"); - } else if (garray[g].private && parray[p].adminLevel==ADMIN_USER) { - pprintf (p, "Sorry, game %d is a private game.\n", g+1); - } else { - if (garray[g].private) - pprintf(p, "Refreshing PRIVATE game %d\n", g+1); - send_board_to(g, p); - } - } - return COM_OK; -} - -PUBLIC int com_open(int p, param_list param) -{ - int retval; - ASSERT(param[0].type == TYPE_NULL); - if ((retval = pcommand(p, "set open")) != COM_OK) - return retval; - else - return COM_OK_NOPROMPT; -} - -PUBLIC int com_simopen(int p, param_list param) -{ - int retval; - ASSERT(param[0].type == TYPE_NULL); - if ((retval = pcommand(p, "set simopen")) != COM_OK) - return retval; - else - return COM_OK_NOPROMPT; -} - -PUBLIC int com_bell(int p, param_list param) -{ - int retval; - ASSERT(param[0].type == TYPE_NULL); - if ((retval = pcommand(p, "set bell")) != COM_OK) - return retval; - else - return COM_OK_NOPROMPT; -} - -PUBLIC int com_flip(int p, param_list param) -{ - int retval; - ASSERT(param[0].type == TYPE_NULL); - if ((retval = pcommand(p, "set flip")) != COM_OK) - return retval; - else - return COM_OK_NOPROMPT; -} - -PUBLIC int com_highlight(int p, param_list param) -{ - pprintf(p, "Obsolete command. Please do set highlight <0-15>.\n"); - return COM_OK; -} - -PUBLIC int com_style(int p, param_list param) -{ - int retval; - ASSERT(param[0].type == TYPE_INT); - if ((retval = pcommand(p, "set style %d", param[0].val.integer)) != COM_OK) - return retval; - else - return COM_OK_NOPROMPT; -} - -PUBLIC int com_promote(int p, param_list param) -{ - int retval; - ASSERT(param[0].type == TYPE_WORD); - if ((retval = pcommand(p, "set promote %s", param[0].val.word)) != COM_OK) - return retval; - else - return COM_OK_NOPROMPT; -} - -PUBLIC int com_alias(int p, param_list param) -{ - int al; - - if (param[0].type == TYPE_NULL) { - for (al = 0; al < parray[p].numAlias; al++) { - pprintf(p, "%s -> %s\n", parray[p].alias_list[al].comm_name, - parray[p].alias_list[al].alias); - } - return COM_OK; - } - al = alias_lookup(param[0].val.word, parray[p].alias_list, parray[p].numAlias); - if (param[1].type == TYPE_NULL) { - if (al < 0) { - pprintf(p, "You have no alias named '%s'.\n", param[0].val.word); - } else { - pprintf(p, "%s -> %s\n", parray[p].alias_list[al].comm_name, - parray[p].alias_list[al].alias); - } - } else { - if (al < 0) { - if (parray[p].numAlias >= MAX_ALIASES - 1) { - pprintf(p, "You have your maximum of %d aliases.\n", MAX_ALIASES - 1); - } else { - - if (!strcmp(param[0].val.string, "quit")) { /* making sure they - can't alias quit */ - pprintf(p, "You can't alias this command.\n"); - } else if (!strcmp(param[0].val.string, "unalias")) { /* making sure they - can't alias unalias - :) */ - pprintf(p, "You can't alias this command.\n"); - } else { - parray[p].alias_list[parray[p].numAlias].comm_name = - strdup(param[0].val.word); - parray[p].alias_list[parray[p].numAlias].alias = - strdup(param[1].val.string); - parray[p].numAlias++; - pprintf(p, "Alias set.\n"); - - } - } - } else { - rfree(parray[p].alias_list[al].alias); - parray[p].alias_list[al].alias = strdup(param[1].val.string); - pprintf(p, "Alias replaced.\n"); - } - parray[p].alias_list[parray[p].numAlias].comm_name = NULL; - } - return COM_OK; -} - -PUBLIC int com_unalias(int p, param_list param) -{ - int al; - int i; - - ASSERT(param[0].type == TYPE_WORD); - al = alias_lookup(param[0].val.word, parray[p].alias_list, parray[p].numAlias); - if (al < 0) { - pprintf(p, "You have no alias named '%s'.\n", param[0].val.word); - } else { - rfree(parray[p].alias_list[al].comm_name); - rfree(parray[p].alias_list[al].alias); - for (i = al; i < parray[p].numAlias; i++) { - parray[p].alias_list[i].comm_name = parray[p].alias_list[i + 1].comm_name; - parray[p].alias_list[i].alias = parray[p].alias_list[i + 1].alias; - } - parray[p].numAlias--; - parray[p].alias_list[parray[p].numAlias].comm_name = NULL; - pprintf(p, "Alias removed.\n"); - } - return COM_OK; -} - -PUBLIC int com_servers(int p, param_list param) -{ -/* - int i; - - ASSERT(param[0].type == TYPE_NULL); - if (numServers == 0) { - */ pprintf(p, "There are no other servers known to this server.\n"); - return COM_OK; -} - /* pprintf(p, "There are %d known servers.\n", numServers); pprintf(p, "(Not - all of these may be active)\n"); pprintf(p, "%-30s%-7s\n", "HOST", - "PORT"); for (i = 0; i < numServers; i++) pprintf(p, "%-30s%-7d\n", - serverNames[i], serverPorts[i]); return COM_OK; } */ - -PUBLIC int com_index(int p, param_list param) -{ - int i; - char index_default[] = "_index"; - char *iwant, *filenames[100]; /* enough for all index filenames */ - - if (param[0].type == TYPE_NULL) { - iwant = index_default; - } else { - iwant = param[0].val.word; - if (!safestring(iwant)) { - pprintf(p, "Illegal character in category %s.\n", iwant); - return COM_OK; - } - } - - i = search_directory(index_dir, iwant, filenames, 1000); - if (i == 0) { - pprintf(p, "No index entry for \"%s\".\n", iwant); - } else if ((i == 1) || !strcmp(*filenames, iwant)) { - if (psend_file(p, index_dir, *filenames)) { - /* we should never reach this unless the file was just deleted */ - pprintf(p, "Index file %s could not be found! ", *filenames); - pprintf(p, "Please inform an admin of this. Thank you.\n"); - } - } else { - pprintf(p, "Matches:"); - display_directory(p, filenames, i); - } - return COM_OK; -} - -PUBLIC int com_help(int p, param_list param) -{ - int i, UseLang = parray[p].language; - char help_default[] = "_help"; - char *iwant, *filenames[1000]; /* enough for all helpfile names */ - - if (param[0].type == TYPE_NULL) { - iwant = help_default; - } else { - iwant = param[0].val.word; - if (!safestring(iwant)) { - pprintf(p, "Illegal character in command %s.\n", iwant); - return COM_OK; - } - } - i = search_directory(help_dir[UseLang], iwant, filenames, 1000); - if (i == 0) { - if (UseLang != LANG_DEFAULT) { - i += search_directory(help_dir[LANG_DEFAULT], iwant, filenames, 1000); - if (i > 0) { - pprintf(p, "No help available in %s; using %s instead.\n", - Language(UseLang), Language(LANG_DEFAULT)); - UseLang = LANG_DEFAULT; - } - } - if (i==0) { - pprintf(p, "No help available on \"%s\".\n", iwant); - return COM_OK; - } - } - if ((i == 1) || !strcmp(*filenames, iwant)) { - if (psend_file(p, help_dir[UseLang], *filenames)) { - /* we should never reach this unless the file was just deleted */ - pprintf(p, "Helpfile %s could not be found! ", *filenames); - pprintf(p, "Please inform an admin of this. Thank you.\n"); - } - } else { - pprintf(p, "Matches:"); - display_directory(p, filenames, i); - pprintf(p, "[Type \"info\" for a list of FICS general information files.]\n"); - } - return COM_OK; -} - -PUBLIC int com_info(int p, param_list param) -{ - int n; - char *filenames[1000]; - - if ((n = search_directory(info_dir, NULL, filenames, 1000)) > 0) - display_directory(p, filenames, n); - return COM_OK; -} - -PUBLIC int com_adhelp(int p, param_list param) -{ - int i; - static char nullify = '\0'; - char *iwant, *filenames[1000]; /* enough for all helpfile names */ - - if (param[0].type == TYPE_NULL) { - iwant = &nullify; - } else { - iwant = param[0].val.word; - if (!safestring(iwant)) { - pprintf(p, "Illegal character in command %s.\n", iwant); - return COM_OK; - } - } - - i = search_directory(adhelp_dir, iwant, filenames, 1000); - if (i == 0) { - pprintf(p, "No help available on \"%s\".\n", iwant); - } else if ((i == 1) || !strcmp(*filenames, iwant)) { - if (psend_file(p, adhelp_dir, *filenames)) { - /* we should never reach this unless the file was just deleted */ - pprintf(p, "Helpfile %s could not be found! ", *filenames); - pprintf(p, "Please inform an admin of this. Thank you.\n"); - } - } else { - if (*iwant) - pprintf(p, "Matches:\n"); - display_directory(p, filenames, i); - } - return COM_OK; -} - -PUBLIC int com_mailsource(int p, param_list param) -{ - static char nullify = '\0'; - char *iwant, *buffer[1000]; - char subj[81], fname[MAX_FILENAME_SIZE]; - int count; - - if (!parray[p].registered) { - pprintf(p, "Only registered people can use the mailsource command.\n"); - return COM_OK; - } - - if (param[0].type == TYPE_NULL) { - iwant = &nullify; - } else { - iwant = param[0].val.word; - } - - count = search_directory(source_dir, iwant, buffer, 1000); - if (count == 0) { - pprintf(p, "Found no source file matching \"%s\".\n", iwant); - } else if ((count == 1) || !strcmp(iwant, *buffer)) { - sprintf(subj, "FICS source file from server %s: %s",fics_hostname,*buffer); - sprintf(fname, "%s/%s",source_dir, *buffer); - mail_file_to_user (p, subj, fname); - pprintf(p, "Source file %s sent to %s\n", *buffer, parray[p].emailAddress); - } else { - pprintf(p, "Found %d source files matching that:\n", count); - if (*iwant) - display_directory(p, buffer, count); - else { /* this junk is to get *.c *.h */ - multicol *m = multicol_start(count); - char *s; - int i; - for (i=0; i < count; i++) { - if (((s = buffer[i] + strlen(buffer[i]) - 2) >= buffer[i]) && (!strcmp(s, ".c") || !strcmp(s, ".h"))) - multicol_store(m, buffer[i]); - } - multicol_pprint(m, p, 78, 1); - multicol_end(m); - } - } - return COM_OK; -} - -PUBLIC int com_mailhelp(int p, param_list param) -{ /* Sparky */ - char subj[81], fname[MAX_FILENAME_SIZE]; - char *iwant, *buffer[1000]; - - int count; - static char nullify = '\0'; - - if (!parray[p].registered) { - pprintf(p, "Only registered people can use the mailhelp command.\n"); - return COM_OK; - } - if (param[0].type == TYPE_NULL) - iwant = &nullify; - else - iwant = param[0].val.word; - - count = search_directory(help_dir[parray[p].language], iwant, buffer, 1000); - if (count == 0) { - pprintf(p, "Found no help file matching \"%s\".\n", iwant); - } else if (count == 1) { - sprintf(subj, "FICS help file from server %s: %s", fics_hostname, *buffer); - sprintf(fname, "%s/%s",help_dir[parray[p].language], *buffer); - mail_file_to_user (p, subj, fname); - pprintf(p, "Help file %s sent to %s\n", *buffer, parray[p].emailAddress); - } else { - pprintf(p, "Found %d helpfiles matching that:\n", count); - display_directory(p, buffer, count); - } - - return COM_OK; -} - -PUBLIC int com_handles(int p, param_list param) -{ - char *buffer[1000]; - char pdir[MAX_FILENAME_SIZE]; - int count; - - sprintf(pdir, "%s/%c", player_dir, param[0].val.word[0]); - count = search_directory(pdir, param[0].val.word, buffer, 1000); - pprintf(p, "Found %d names.\n", count); - if (count > 0) - display_directory(p, buffer, count); - return COM_OK; -} - -PUBLIC int com_getpi(int p, param_list param) -{ - int p1; - - if (!in_list("td", parray[p].name)) { - pprintf(p, "Only TD programs are allowed to use this command.\n"); - return COM_OK; - } - if (((p1 = player_find_bylogin(param[0].val.word)) < 0) || (parray[p1].registered == 0)) { - /* Darkside suggested not to return anything */ - return COM_OK; - } - if (!parray[p1].registered) { - pprintf(p, "*getpi %s -1 -1 -1*\n", parray[p1].name); - } else { - pprintf(p, "*getpi %s %d %d %d*\n", parray[p1].name, - parray[p1].w_stats.rating, - parray[p1].b_stats.rating, - parray[p1].s_stats.rating); - } - return COM_OK; -} - -PUBLIC int com_getps(int p, param_list param) -{ - int p1; - - if ((((p1 = player_find_bylogin(param[0].val.word)) < 0) || (parray[p1].registered == 0)) || (parray[p1].game < 0)) { - pprintf(p, "*status %s 1*\n", param[0].val.word); - return COM_OK; - } - pprintf(p, "*status %s 0 %s*\n", parray[p1].name, parray[(parray[p1].opponent)].name); - return COM_OK; -} -PUBLIC int com_limits(int p, param_list param) -{ - pprintf(p, "\nCurrent hardcoded limits:\n"); - pprintf(p, " Max number of players: %d\n", MAX_PLAYER); - pprintf(p, " Max number of channels and max capacity: %d\n", MAX_CHANNELS); - pprintf(p, " Max number of channels one can be in: %d\n", MAX_INCHANNELS); - pprintf(p, " Max number of people on the notify list: %d\n", MAX_NOTIFY); - pprintf(p, " Max number of aliases: %d\n", MAX_ALIASES - 1); - pprintf(p, " Max number of games you can observe at a time: %d\n", MAX_OBSERVE); - pprintf(p, " Max number of requests pending: %d\n", MAX_PENDING); - pprintf(p, " Max number of people on the censor list: %d\n", MAX_CENSOR); - pprintf(p, " Max number of people in a simul game: %d\n", MAX_SIMUL); - pprintf(p, " Max number of messages one can receive: %d\n", MAX_MESSAGES); - pprintf(p, " Min number of games to be active: %d\n", PROVISIONAL); - pprintf(p, "\nAdmin settable limits:\n"); - pprintf(p, " Quota list gives two shouts per %d seconds.\n", quota_time); - return COM_OK; -} |