lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* Do not remove the headers from this file! see /USAGE for more info. */

/*
** newsdata.c
**
** Provides the player data for the newsreader.
**
** 24-Dec-94. Deathblade. Created
** 03-Dec-97  Explanded to use M_SET (thus getting rid of highwater tracking)
**            Tigran
** 13-Mar-98  Added toggleable threading and the ability to mark articles in 
**            a newsgroup unread -- Tigran.
*/

inherit M_SET;

void save_me();
private string array subscribed_groups();
private int check_subscribed(string group);

private nomask mapping news_data;
private nomask int threading_toggled=1;

nomask int set_threading(int i)
{
  if(i)
    threading_toggled=1;
  else
    threading_toggled=0;
}

nomask int query_threading()
{
  return threading_toggled;
}

/* Function that should be used to catch up a group */
nomask void catch_up_newsgroup(string group)
{
  news_data[group]=sprintf("%c%s",
			   news_data[group][0],
			   set_add_range("",
					 1,
					 NEWS_D->get_group_last_id(group) ) );
  save_me();
}

nomask void mark_newsgroup_unread(string group)
{
  news_data[group]=sprintf("%c",check_subscribed(group)?':':'#');
  save_me();
}

/* Function for querying whigh articles have been read */
nomask string get_news_id_read(string group)
{
  if(!valid_set(news_data[group][1..]))
    {
      catch_up_newsgroup(group);
      printf("Your news read data has been corrupted, marking everything as read.\n"
	     "Please notify Tigran@Lima Bean that this happened");
    }
      if(strlen(news_data[group])<=1)
        return "";
  return news_data[group][1..];
}


/* Function for adding a news article to the list of read articles */
nomask void add_news_id_read(string group,int id)
{
  if(set_min(news_data[group][1..])==0)
    {
      news_data[group]=sprintf("%c%s",
			       news_data[group][0],
			       set_remove(news_data[group][1..],
					  0) );
    }
  news_data[group]=sprintf("%c%s",
			   news_data[group][0],
			   set_add(news_data[group][1..],
				   id) );
  save_me();
}

/* If the group is regisetered mark it unsubscribed, if it is not yet 
 * registered we must take care of that as well */
nomask void unsubscribe_group(string group)
{
  if(undefinedp(news_data[group])) {
    news_data[group]="#";
  }
  else {
    news_data[group]=sprintf("#%s",
			     news_data[group][1..]);
  }
  save_me();
}

/* If the group is already registered, subscribe to it, if not registered
 * we need to do that too. */
nomask void subscribe_group(string group)
{
  if(undefinedp(news_data[group])) {
    news_data[group]=":";
  }
  else {
    news_data[group]=sprintf(":%s",
			     news_data[group][1..]);
  }
  save_me();
}

/* Check to see if the group is subscribed to */
nomask int check_subscribed(string group)
{
  return news_data[group][0]=='#'?0:1;
}

/* Return a list of all subscribed groups.  Possibly this should be removed
 * as it may be redundant w/ the existance of registered_groups() */
nomask string array subscribed_groups()
{
  string array groups;
  if(!sizeof(news_data))
    return 0;
  groups=sort_array(keys(news_data),1);
  return filter(groups,
		(: check_subscribed :) );
}

/* Returns all groups that are registered either as subscribed or 
 * unsubscribed */
nomask string array registered_groups()
{
  if(!sizeof(news_data))
    return 0;
  return keys(news_data);
}

/* Function that removes groups from your news_data that aren't in NEWS_D */
/* Added by Tigran.  This function also converts news data into the proper
 * format if it has not already been done */
nomask void validate_groups()
{
  string array groups;
  if(!news_data) {
    news_data=([]);
  }
  if(!sizeof(news_data))
    return;
  groups = keys(news_data) - NEWS_D->get_groups();
  map_array(groups, (: map_delete(news_data, $1) :));
  foreach(string group,mixed data in news_data) {
    if(intp(data)) {
      data=sprintf(":%s",set_add_range("",1,data) );
    }
  }
  save_me();
}

nomask mapping get_news_data()
{
  return news_data;
}