/*
* Playground+ - dsc.c
* Multiple dynamic user defined saved channels (c) phypor 1998
* ---------------------------------------------------------------------------
*
* Modifications to original release:
* Include paths
* varible argument functions
* remove plural gender cases
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "include/config.h"
#include "include/player.h"
#include "include/proto.h"
/* if you want to have a diffrent char appear in front of channel stufs,
change it here....(note, keep it a single char with '' around it ...)
*/
#define DSC_TAG ')'
void tell_channels(char *channel, char *msg)
{
player *scan;
int i, oct = command_type;
command_type = 0;
for (scan = flatlist_start; scan; scan = scan->flat_next)
for (i = 0; i < MAX_CHANNELS; i++)
if (!strcasecmp(scan->channels[i], channel) &&
!(scan->dsc_flags & BLOCK_ALL_CHANS))
{
if (scan->dsc_flags & HI_CHANS)
command_type |= HIGHLIGHT;
TELLPLAYER(scan, "%c %s", DSC_TAG, msg);
if (scan->dsc_flags & HI_CHANS)
command_type &= ~HIGHLIGHT;
break;
}
command_type = oct;
}
void connect_channels(player * p)
{
char *oldstack = stack;
int i;
if (p->dsc_flags & BLOCK_ALL_CHANS)
return;
for (i = 0; i < MAX_CHANNELS; i++)
if (*(p->channels[i]))
{
sprintf(stack, "[%s] ++ %s logs in and joins this channel ++\n", p->channels[i], p->name);
stack = end_string(stack);
tell_channels(p->channels[i], oldstack);
stack = oldstack;
}
}
void disconnect_channels(player * p)
{
char *oldstack = stack;
int i;
if (p->dsc_flags & BLOCK_ALL_CHANS || !p->location || !p->name[0])
return;
for (i = 0; i < MAX_CHANNELS; i++)
if (*(p->channels[i]))
{
sprintf(stack, "[%s] -- %s leaves this channel and quits %s --\n",
p->channels[i], p->name, get_config_msg("talker_name"));
stack = end_string(stack);
tell_channels(p->channels[i], oldstack);
stack = oldstack;
}
}
char *says_asks_exclaims(player * p, char *str)
{
if (*str)
switch (str[strlen(str) - 1])
{
case '!':
return "exclaims";
case '?':
return "asks";
}
return "says";
}
int tell_command_channel(player * p, char *chan, char *msg)
{
int i;
char *oldstack = stack;
if (p->dsc_flags & BLOCK_ALL_CHANS)
return 0;
for (i = 0; i < MAX_CHANNELS; i++)
{
if (!strncasecmp(p->channels[i], chan, strlen(chan)))
{
sprintf(stack, "[%s] %s %s '%s'\n", p->channels[i], p->name,
says_asks_exclaims(p, msg), msg);
stack = end_string(stack);
tell_channels(p->channels[i], oldstack);
stack = oldstack;
return 1;
}
}
return 0;
}
int remote_command_channel(player * p, char *chan, char *msg)
{
int i;
char *oldstack = stack;
if (p->dsc_flags & BLOCK_ALL_CHANS)
return 0;
for (i = 0; i < MAX_CHANNELS; i++)
{
if (!strncasecmp(p->channels[i], chan, strlen(chan)))
{
if ((*msg == '\'') || (*msg == ','))
sprintf(stack, "[%s] %s%s\n", p->channels[i], p->name, msg);
else
sprintf(stack, "[%s] %s %s\n", p->channels[i], p->name, msg);
stack = end_string(stack);
tell_channels(p->channels[i], oldstack);
stack = oldstack;
return 1;
}
}
return 0;
}
void list_whos_on_channel(player * p, char *channel)
{
player *scan;
int counted = 0, i;
char *oldstack = stack, temp[70];
sprintf(temp, "People on the '%s' channel", channel);
pstack_mid(temp);
for (scan = flatlist_start; scan; scan = scan->flat_next)
for (i = 0; i < MAX_CHANNELS; i++)
if (!strcasecmp(scan->channels[i], channel))
{
counted++;
if (scan->dsc_flags & BLOCK_ALL_CHANS)
stack += sprintf(stack, "(%s), ", scan->name);
else
stack += sprintf(stack, "%s, ", scan->name);
}
if (counted)
{
stack = end_string(stack);
oldstack[strlen(oldstack) - 2] = '.';
oldstack[strlen(oldstack) - 1] = '\n';
tell_player(p, oldstack);
tell_player(p, LINE);
}
else
tell_player(p, " No-one on the channel ?!? *le boggle*\n");
stack = oldstack;
}
void list_channels(player * p, char *str)
{
int i, hit = 0;
char *oldsac = stack, temp[70];
for (i = 0; i < MAX_CHANNELS; i++)
if (*(p->channels[i]))
break;
if (i == MAX_CHANNELS)
{
tell_player(p, " You aren't on any channels atm.\n");
return;
}
if (*str)
{
for (i = 0; i < MAX_CHANNELS; i++)
if (!strncasecmp(p->channels[i], str, strlen(str)))
{
list_whos_on_channel(p, p->channels[i]);
return;
}
TELLPLAYER(p, " But you aren't on the '%s' channel?\n", str);
return;
}
pstack_mid("You are on the following channels");
for (i = 0; i < MAX_CHANNELS; i++)
if (*(p->channels[i]))
{
stack += sprintf(stack, " %s\n", p->channels[i]);
hit++;
}
if (hit)
{
if (hit == 1)
sprintf(temp, "1 channel out of a maximum of %d", MAX_CHANNELS);
else
sprintf(temp, "%d channels out of a maximum of %d", hit, MAX_CHANNELS);
pstack_mid(temp);
*stack++ = 0;
tell_player(p, oldsac);
}
else
tell_player(p, " You are on no channels at all.\n");
stack = oldsac;
if (p->dsc_flags & BLOCK_ALL_CHANS)
tell_player(p, " Btw, you are blocking all channels.\n");
}
void join_channel(player * p, char *str)
{
char *oldstack = stack, *ptr = str;
player *p2, dummy;
int i;
if (!*str)
{
tell_player(p, " Format : join_chan <channel to join>\n");
return;
}
if (p->dsc_flags & BLOCK_ALL_CHANS)
{
tell_player(p, " You should unblock channels before doing that.\n");
return;
}
while (*ptr++)
if (*ptr == ' ')
{
*ptr = '\0';
break;
}
if (strlen(str) > MAX_NAME - 2)
{
tell_player(p, " That is just too long to have as a channel name.\n");
return;
}
p2 = find_player_absolute_quiet(str);
if (p2)
{
tell_player(p, " You dont really want to name your channel "
"after a person... do you?\n");
return;
}
strncpy(dummy.lower_name, str, MAX_NAME - 1);
lower_case(dummy.lower_name);
dummy.fd = p->fd;
if (load_player(&dummy))
{
tell_player(p, " You dont really want to name your channel "
"after a person... do you?.\n");
return;
}
for (i = 0; i < MAX_CHANNELS; i++)
if (!strcasecmp(p->channels[i], str))
{
tell_player(p, " You are already on that channel.\n");
return;
}
for (i = 0; i < MAX_CHANNELS; i++)
if (!*(p->channels[i]))
break;
if (*(p->channels[i]))
{
tell_player(p, " You are on the most channels that you may join.\n");
return;
}
strncpy(p->channels[i], str, MAX_NAME - 1);
sprintf(stack, "[%s] ++ %s joins this channel ++\n", str, p->name);
stack = end_string(stack);
tell_channels(str, oldstack);
stack = oldstack;
}
void leave_channel(player * p, char *str)
{
char *oldstack = stack;
int i;
if (!*str)
{
tell_player(p, " Format : leave_chan <channel to leave>\n");
return;
}
for (i = 0; i < MAX_CHANNELS; i++)
if (!strcasecmp(p->channels[i], str))
{
sprintf(stack, "[%s] -- %s leaves this channel --\n", str, p->name);
stack = end_string(stack);
tell_channels(str, oldstack);
stack = oldstack;
memset(p->channels[i], 0, MAX_NAME);
if (p->dsc_flags & BLOCK_ALL_CHANS)
tell_player(p, " You leave the channel.\n");
return;
}
tell_player(p, " You don't seem to be on that channel.\n");
}
void hichan(player * p, char *str)
{
if (!*str)
p->dsc_flags ^= HI_CHANS;
else if (!strcasecmp(str, "on"))
p->dsc_flags |= HI_CHANS;
else if (!strcasecmp(str, "off"))
p->dsc_flags &= ~HI_CHANS;
else
tell_player(p, " Format : chan_hi [on/off]\n");
if (p->dsc_flags & HI_CHANS)
tell_player(p, " You will get channels hilighted.\n");
else
tell_player(p, " You will not get channels hilighted.\n");
}
void block_all_channels(player * p, char *str)
{
if (!*str)
p->dsc_flags ^= BLOCK_ALL_CHANS;
else if (!strcasecmp(str, "on"))
p->dsc_flags |= BLOCK_ALL_CHANS;
else if (!strcasecmp(str, "off"))
p->dsc_flags &= ~BLOCK_ALL_CHANS;
else
tell_player(p, " Format : block_all_chans [on/off]\n");
if (p->dsc_flags & BLOCK_ALL_CHANS)
tell_player(p, " You are blocking off all channels.\n");
else
tell_player(p, " You are not blocking channels.\n");
}