/**
* \file plyrlist.c
*
* \brief Player list management for PennMUSH.
*
*
*/
#include "config.h"
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include "copyrite.h"
#include "conf.h"
#include "externs.h"
#include "mushdb.h"
#include "dbdefs.h"
#include "flags.h"
#include "htab.h"
#include "confmagic.h"
/** Hash table of player names */
HASHTAB htab_player_list;
static int hft_initialized = 0;
static void init_hft(void);
static void
init_hft(void)
{
hashinit(&htab_player_list, 256, sizeof(dbref));
hft_initialized = 1;
}
/** Clear the player list htab. */
void
clear_players(void)
{
if (hft_initialized)
hashflush(&htab_player_list, 256);
else
init_hft();
}
/** Add a player to the player list htab.
* \param player dbref of player to add.
* \param alias name to use as hash table key for player, if given.
*/
void
add_player(dbref player, const char *alias)
{
if (!hft_initialized)
init_hft();
if (alias)
hashadd(strupper(alias), (void *) player, &htab_player_list);
else
hashadd(strupper(Name(player)), (void *) player, &htab_player_list);
}
/** Look up a player in the player list htab (or by dbref).
* \param name name of player to find.
* \return dbref of player, or NOTHING.
*/
dbref
lookup_player(const char *name)
{
int p;
void *hval;
if (!name || !*name)
return NOTHING;
if (*name == NUMBER_TOKEN) {
name++;
if (!is_strict_number(name))
return NOTHING;
p = atoi(name);
return ((GoodObject(p) && IsPlayer(p)) ? p : NOTHING);
}
if (*name == LOOKUP_TOKEN)
name++;
hval = hashfind(strupper(name), &htab_player_list);
if (!hval)
return NOTHING;
return (dbref) hval;
/* By the way, there's a flaw in this code. If #0 was a player, we'd
* hash its name with a dbref of (void *)0, aka NULL, so we'd never
* be able to retrieve that player. However, we assume that #0 will
* always be the base room, and never a player, so that's ok.
* Nathan Baum offered a fix (hash the value + 1 and subtract 1 on
* lookup) but we (foolishly?) cling to our assumption and don't bother.
*/
}
/** Remove a player from the player list htab.
* \param player dbref of player to remove.
* \param alias key to remove if given.
*/
void
delete_player(dbref player, const char *alias)
{
if (alias)
hashdelete(strupper(alias), &htab_player_list);
else
hashdelete(strupper(Name(player)), &htab_player_list);
}