/* 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;
}