// File : /adm/daemons/news.c // Creator : Glenn Ferguson (Watcher@TMI) 02/03/93 // // This daemon handles the MOTD/NEWS displayed to a // user on login. It distinguishes between type of // user and how many times they have seen a message. // // 19-Dec-94 Leto added some copy()'s to prevent fake news ;) #include <mudlib.h> #include <config.h> #include <ansi.h> inherit DAEMON ; // If HEADER = 1, the header will be placed on news message // If HEADER = 0, the header will be ignored #define HEADER 1 // If ANSI = 1, portions of the header will be bolded // If ANSI = 0, standard header output will be used #define ANSI 0 #define MUD_INTRO NEWS_DIR + "news" int load_news_list(); static int sweep_save(); static string add_message(string file); static string make_header(string file, string type, int date); static int check_read_num(string file, int view); mapping list; string *files; void create() { ::create(); load_news_list(); } int load_news_list() { mixed *dir; string type; int date, view, loop; // First declare the master list mapping list = ([ ]); // Get array of all filenames in the news directory dir = get_dir( NEWS_DIR ); if(!dir || !sizeof(dir)) return 0; // Hmmmm...no news files for(loop=0; loop<sizeof(dir); loop++) { // First parse the news item for structure info and // discard any that do not match the preset format if(!dir || sscanf(dir[loop],"%d:%s:%d", date, type, view) != 3) continue; // Save news item information in master list mapping list[ dir[loop] ] = ([ "date" : date, "type" : type, "view" : view ]); } // Produce a list of news files in the master list mapping files = keys( list ); return 1; } mapping query_list() { return copy(list); } string *query_files() { return copy(files); } // Display the news to user when called during login. The news // are returned in the form of a string in case someone wants to // put the output in the form of a more, in the future. string display_news() { string output, who; int loop, flag; // Initalize MOTD output string if(file_exists( MUD_INTRO )) output = read_file( MUD_INTRO ); else output = ""; if (this_player()->query("hushlogin")) output = ""; for(loop=0; loop<sizeof(files); loop++) { // Ignore player news when user is a wizard if(list[files[loop]]["type"] == "p" && wizardp(this_player())) continue; // Ignore wizard news when user is a player if(list[files[loop]]["type"] == "w" && !wizardp(this_player())) continue; // Display news file if no view time limitations if(list[files[loop]]["view"] == 0) { if(HEADER) output += make_header(files[loop], list[files[loop]]["type"], list[files[loop]]["date"]); output += add_message(files[loop]); flag++; continue; } // Display news file if view times is under required if(check_read_num(files[loop], list[files[loop]]["view"])) { if(HEADER) output += make_header(files[loop], list[files[loop]]["type"], list[files[loop]]["date"]); output += add_message(files[loop]); flag++; continue; } } who = (string) this_player()->query("name"); if(!flag) output += "** No new News to read **\n\n"; // Clean up old news file names saved in user mapping sweep_save(); return output; } // Check to see how many times the news item has been // read by this user and save updated count. static int check_read_num(string file, int view) { mapping store; store = this_player()->query("news_save"); if(!store) store = ([ ]); if(store[file]) { if(store[file] == view) return 0; // Viewed required times store[file]++; this_player()->set("news_save", store); return 1; } store[file] = 1; this_player()->set("news_save", store); return 1; } // Check through user's stored files and delete old versions static int sweep_save() { mapping save; string *tmp; int loop; save = (mapping)this_player()->query("news_save"); if(!save || !sizeof(save)) return 0; tmp = keys( save ); if(!tmp || !sizeof(tmp)) return 0; for(loop=0; loop<sizeof(tmp); loop++) if(member_array(tmp[loop], files) == -1) map_delete(save, tmp[loop]); this_player()->set("news_save", save); return 1; } // Add news file contents to displaying output static string add_message(string file) { return read_file( NEWS_DIR + file, 3) + "\n"; } // Construct title header for news item static string make_header(string file, string type, int date) { string header; // If ansi bolding is enabled, bold the news type if(ANSI) header = ESC + "[7m"; else header = ""; // Output message news type if(type == "p") header += "[Player News]"; else if(type == "w") header += "[Wizard News]"; else header += "[General News]"; if(ANSI) header += ESC + "[0m"; // Add news item's title to header header += " " + read_file ( NEWS_DIR + file, 1, 1); // Add time stamp to header header += "Posted:\t" + ctime(date) + "\n"; return (header + "\n"); } static int clean_news_save() { mapping tmp; tmp = this_player()->query("news_save"); return 1; }