/*-
* Copyright (c) 1998 fjoe <fjoe@iclub.nsu.ru>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: olc_social.c,v 1.6 1999/03/10 11:06:24 fjoe Exp $
*/
#include <stdio.h>
#include <string.h>
#include "merc.h"
#include "olc.h"
#include "db/socials.h"
#define EDIT_SOC(ch, soc) (soc = (social_t*) ch->desc->pEdit)
DECLARE_OLC_FUN(soced_create );
DECLARE_OLC_FUN(soced_edit );
DECLARE_OLC_FUN(soced_show );
DECLARE_OLC_FUN(soced_list );
DECLARE_OLC_FUN(soced_name );
DECLARE_OLC_FUN(soced_min_pos );
DECLARE_OLC_FUN(soced_found_char );
DECLARE_OLC_FUN(soced_found_vict );
DECLARE_OLC_FUN(soced_found_notvict );
DECLARE_OLC_FUN(soced_noarg_char );
DECLARE_OLC_FUN(soced_noarg_room );
DECLARE_OLC_FUN(soced_self_char );
DECLARE_OLC_FUN(soced_self_room );
DECLARE_OLC_FUN(soced_notfound_char );
static DECLARE_VALIDATE_FUN(validate_name);
olc_cmd_t olc_cmds_soc[] =
{
{ "create", soced_create },
{ "edit", soced_edit },
{ "touch", olced_dummy },
{ "show", soced_show },
{ "list", soced_list },
{ "name", soced_name, validate_name },
{ "min_pos", soced_min_pos, position_table },
{ "found_char", soced_found_char },
{ "found_vict", soced_found_vict },
{ "found_notvict", soced_found_notvict },
{ "noarg_char", soced_noarg_char },
{ "noarg_room", soced_noarg_room },
{ "self_char", soced_self_char },
{ "self_room", soced_self_room },
{ "notfound_char", soced_notfound_char },
{ "commands", show_commands },
{ NULL }
};
OLC_FUN(soced_create)
{
social_t *soc;
char arg[MAX_STRING_LENGTH];
if (ch->pcdata->security < SECURITY_SOCIALS) {
char_puts("SocEd: Insufficient security for creating socials\n",
ch);
return FALSE;
}
one_argument(argument, arg, sizeof(arg));
if (arg[0] == '\0') {
do_help(ch, "'OLC CREATE'");
return FALSE;
}
if ((soc = social_lookup(arg, str_cmp))) {
char_printf(ch, "SocEd: %s: already exists.\n", soc->name);
return FALSE;
}
soc = social_new();
soc->name = str_dup(arg);
ch->desc->pEdit = (void *) soc;
OLCED(ch) = olced_lookup(ED_SOC);
char_puts("Social created.\n",ch);
return FALSE;
}
OLC_FUN(soced_edit)
{
social_t *soc;
char arg[MAX_STRING_LENGTH];
if (ch->pcdata->security < SECURITY_SOCIALS) {
char_puts("SocEd: Insufficient security.\n", ch);
return FALSE;
}
one_argument(argument, arg, sizeof(arg));
if (arg[0] == '\0') {
do_help(ch, "'OLC EDIT'");
return FALSE;
}
if ((soc = social_lookup(arg, str_cmp)) == NULL) {
char_printf(ch, "SocEd: %s: No such social.\n", arg);
return FALSE;
}
ch->desc->pEdit = soc;
OLCED(ch) = olced_lookup(ED_SOC);
return FALSE;
}
#define SOC_SHOW(format, s) \
if (!IS_NULLSTR(s)) \
buf_printf(output, format, s);
OLC_FUN(soced_show)
{
char arg[MAX_STRING_LENGTH];
BUFFER *output;
social_t *soc;
one_argument(argument, arg, sizeof(arg));
if (arg[0] == '\0') {
if (IS_EDIT(ch, ED_SOC))
EDIT_SOC(ch, soc);
else {
do_help(ch, "'OLC ASHOW'");
return FALSE;
}
}
else {
if ((soc = social_lookup(arg, str_prefix)) == NULL) {
char_printf(ch, "SocEd: %s: No such social.\n", arg);
return FALSE;
}
}
output = buf_new(-1);
buf_printf(output,
"name: [%s]\n",
soc->name);
buf_printf(output,
"min_pos: [%s]\n",
flag_string(position_table, soc->min_pos));
SOC_SHOW("found_char: [%s]\n", soc->found_char);
SOC_SHOW("found_vict: [%s]\n", soc->found_vict);
SOC_SHOW("found_notvict: [%s]\n", soc->found_notvict);
SOC_SHOW("noarg_char: [%s]\n", soc->noarg_char);
SOC_SHOW("noarg_room: [%s]\n", soc->noarg_room);
SOC_SHOW("self_char: [%s]\n", soc->self_char);
SOC_SHOW("self_room: [%s]\n", soc->self_room);
SOC_SHOW("notfound_char: [%s]\n", soc->notfound_char);
page_to_char(buf_string(output), ch);
buf_free(output);
return FALSE;
}
OLC_FUN(soced_list)
{
int i;
int col = 0;
char arg[MAX_STRING_LENGTH];
one_argument(argument, arg, sizeof(arg));
for (i = 0; i < socials.nused; i++) {
social_t *soc = (social_t*) VARR_GET(&socials, i);
if (arg[0] && str_prefix(arg, soc->name))
continue;
char_printf(ch, "%-12s", soc->name);
if (++col % 6 == 0)
char_puts("\n", ch);
}
if (col % 6)
char_puts("\n", ch);
return FALSE;
}
OLC_FUN(soced_name)
{
social_t *soc;
EDIT_SOC(ch, soc);
return olced_str(ch, argument, cmd, &soc->name);
}
OLC_FUN(soced_min_pos)
{
social_t *soc;
EDIT_SOC(ch, soc);
return olced_flag32(ch, argument, cmd, &soc->min_pos);
}
OLC_FUN(soced_found_char)
{
social_t *soc;
EDIT_SOC(ch, soc);
return olced_str(ch, argument, cmd, &soc->found_char);
}
OLC_FUN(soced_found_vict)
{
social_t *soc;
EDIT_SOC(ch, soc);
return olced_str(ch, argument, cmd, &soc->found_vict);
}
OLC_FUN(soced_found_notvict)
{
social_t *soc;
EDIT_SOC(ch, soc);
return olced_str(ch, argument, cmd, &soc->found_notvict);
}
OLC_FUN(soced_noarg_char)
{
social_t *soc;
EDIT_SOC(ch, soc);
return olced_str(ch, argument, cmd, &soc->noarg_char);
}
OLC_FUN(soced_noarg_room)
{
social_t *soc;
EDIT_SOC(ch, soc);
return olced_str(ch, argument, cmd, &soc->noarg_room);
}
OLC_FUN(soced_self_char)
{
social_t *soc;
EDIT_SOC(ch, soc);
return olced_str(ch, argument, cmd, &soc->self_char);
}
OLC_FUN(soced_self_room)
{
social_t *soc;
EDIT_SOC(ch, soc);
return olced_str(ch, argument, cmd, &soc->self_room);
}
OLC_FUN(soced_notfound_char)
{
social_t *soc;
EDIT_SOC(ch, soc);
return olced_str(ch, argument, cmd, &soc->notfound_char);
}
static VALIDATE_FUN(validate_name)
{
const char *name = (const char*) arg;
social_t *soc, *soc2;
EDIT_SOC(ch, soc);
if (strpbrk(name, " \t")) {
char_printf(ch,
"SocEd: %s: illegal character in social name.\n",
arg);
return FALSE;
}
if ((soc2 = social_lookup(name, str_cmp))
&& soc2 != soc) {
char_printf(ch, "SocEd: %s: duplicate social name.\n", arg);
return FALSE;
}
return TRUE;
}