energymech/src/help.c
2018-04-04 06:04:58 +02:00

269 lines
5.1 KiB
C

/*
EnergyMech, IRC bot software
Copyright (c) 1997-2004 proton
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.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define HELP_C
#include "config.h"
#include "defines.h"
#include "structs.h"
#include "global.h"
#include "h.h"
#include "text.h"
#include "mcmd.h"
#include "usage.h"
void print_help(char *from, char *line, int len)
{
char *lp;
int tl;
tl = TRUE;
if ((strlen(line) + len) > 70)
{
lp = line;
while(*lp)
{
if (*lp == '\037')
tl = !tl;
if (tl)
*lp = tolowertab[(uchar)*lp];
lp++;
}
to_user(from,FMT_PLAIN,line);
*line = 0;
}
}
int do_help_callback(char *line)
{
#ifdef DEBUG
debug("(do_help_callback) `%s'\n",line);
#endif /* DEBUG */
table_buffer(FMT_PLAIN,line);
return(FALSE);
}
void do_help(COMMAND_ARGS)
{
char line[MSGLEN];
char *pt;
int i,level,axs;
int cur,nxt,count,ci,tl;
int in;
if (partyline_only_command(from))
return;
axs = get_maxaccess(from);
if (!*rest)
{
cur = -1;
*line = 0;
help_loop:
count = 0;
nxt = OWNERLEVEL;
for(i=0;mcmd[i].name;i++)
{
tl = acmd[i];
if ((tl < nxt) && (tl > cur))
nxt = tl;
if (tl != cur)
continue;
if (count == 0)
sprintf(line,"\037Level %3i\037: ",cur);
count++;
}
if (!count)
{
cur = nxt;
goto help_loop;
}
ci = count;
for(i=0;mcmd[i].name;i++)
{
tl = acmd[i];
if (tl != cur)
continue;
if (ci != count)
stringcat(line,", ");
print_help(from,line,strlen(mcmd[i].name));
if (*line == 0)
stringcpy(line," ");
stringcat(line,(char*)mcmd[i].name);
count--;
}
print_help(from,line,500);
if ((cur != OWNERLEVEL) && (nxt <= axs))
cur = nxt;
else
return;
goto help_loop;
}
level = asc2int(rest);
if (!errno)
{
if ((level > axs) || (level < 0))
level = axs;
to_user(from,"\037Commands available at Level %i:\037",level);
*line = 0;
ci = 0;
for(i=0;mcmd[i].name;i++)
{
if (acmd[i] <= level)
{
if (ci != 0)
stringcat(line,", ");
ci++;
print_help(from,line,strlen(mcmd[i].name));
stringcat(line,(char*)mcmd[i].name);
}
}
if (ci)
print_help(from,line,58);
else
to_user(from,TEXT_NONE);
return;
}
if (STRCHR(rest,'*'))
{
line[0] = 0;
ci = 0;
to_user(from,"\037Commands that match query %s\037:",rest);
for(i=0;mcmd[i].name;i++)
{
if ((!matches(rest,(char*)mcmd[i].name)) && (acmd[i] <= axs))
{
if (ci != 0)
stringcat(line,", ");
ci++;
print_help(from,line,strlen(mcmd[i].name));
stringcat(line,(char*)mcmd[i].name);
}
}
if (ci)
print_help(from,line,500);
else
to_user(from,TEXT_NONE);
return;
}
pt = stringcpy(line,HELPDIR);
for(i=0;(rest[i]);i++)
{
if (rest[i] >= 'a' && rest[i] <= 'z')
*pt = rest[i] - 0x20;
else
*pt = rest[i];
pt++;
}
*pt = 0;
/*
* We dont want to show help for "../../../../../../etc/passwd"
*/
if (is_safepath(line,FILE_MUST_EXIST) != FILE_IS_SAFE)
{
#ifdef DEBUG
debug("(do_help) unsafe help filename (%s), exiting\n",line);
#endif /* DEBUG */
to_user(from,"Help file for \"%s\" is unavailable.",rest);
return;
}
#ifdef DEBUG
debug("(do_help) help file check: %s\n",line);
#endif /* DEBUG */
if ((in = open(line,O_RDONLY)) < 0)
{
to_user(from,"No help found for \"%s\"",rest);
return;
}
#ifdef DEBUG
debug("(do_help) helpfile for = '%s'\n",rest);
#endif /* DEBUG */
table_buffer("\037Help on %s\037",rest);
level = access_needed(rest);
if (level > 200)
table_buffer("Level needed: Command disabled");
else
if (level > 0)
table_buffer("Level needed: %i",level);
for(i=0;ulist[i].command;i++)
{
if (!stringcasecmp(rest,ulist[i].command))
{
pt = (ulist[i].usage) ? ulist[i].usage : "";
table_buffer("Usage: %s %s",ulist[i].command,pt);
break;
}
}
readline(in,&do_help_callback); /* readline closes in */
table_send(from,0);
}
void usage_command(char *to, const char *arg)
{
char *pt;
int i;
for(i=0;ulist[i].command;i++)
{
if (!stringcasecmp(arg,ulist[i].command))
{
pt = ulist[i].usage;
to_user_q(to,(pt) ? "Usage: %s %s" : "Usage: %s",ulist[i].command,pt);
return;
}
}
to_user(to,"Usage: (missing)");
}
void usage(char *to)
{
CurrentChan = NULL;
usage_command(to,CurrentCmd->name);
}
void do_usage(COMMAND_ARGS)
{
/*
* on_msg checks: CARGS
*/
char *cmd;
int i;
cmd = chop(&rest);
for(i=0;mcmd[i].name;i++)
{
if (!stringcasecmp(cmd,mcmd[i].name))
{
usage_command(from,mcmd[i].name);
return;
}
}
to_user_q(from,"Unknown command: %s",cmd);
}