/**
* This handler will do any mud base manipulations of the twiki
* database.
* @author Pinkfish
* @started Wed May 24 17:19:06 PDT 2000
*/
#include <board.h>
void do_check_changes();
#define SAVE_FILE "/save/twiki"
#define CHECK_TIME (7 * 24 * 60 * 60)
private int _last_check;
void create() {
seteuid(getuid());
restore_object(SAVE_FILE);
if (_last_check + CHECK_TIME < time()) {
do_check_changes();
}
call_out("do_check_changes", _last_check + CHECK_TIME - time());
} /* setup() */
/**
* This method prints out any changes since the specified limit.
* @param limit the time after which to show any changes
* @return the changes since that time
*/
string find_changes(int limit) {
string* lines;
int i;
int tim;
string page;
string author;
mixed* bits;
mapping changes_pages;
string ret;
lines = explode(read_file("/twiki/data/Main/.changes"), "\n");
ret = "Changes since " + ctime(limit) + " in\n"
"http://discworld.imaginary.com/twiki/bin/view/Main/WebHome\n\n";
changes_pages = ([ ]);
for (i = 1; i < sizeof(lines); i++) {
bits = reg_assoc(lines[<i], ({ "([a-zA-Z][a-zA-Z0-9]+)", "[0-9]+" }), ({ 1, 2 }) );
if (sizeof(bits[0]) == 7) {
page = bits[0][1];
author = bits[0][3];
sscanf(bits[0][5], "%d", tim);
if (tim > limit) {
//
// Ignore all the user page changes...
//
if (page[0..4] != "TWiki" &&
author != "PeterThoeny" &&
page != author &&
page != "WebPreferences") {
//
// Read the page and determine from that.
//
if (file_size("/twiki/data/Main/" + page + ".txt") > 0 &&
strsrch(read_file("/twiki/data/Main/" + page + ".txt"),
"\t* Login Name:") == -1) {
if (!changes_pages[page]) {
changes_pages[page] = ({ });
}
if (member_array(author, changes_pages[page]) == -1) {
changes_pages[page] += ({ author });
}
}
}
} else {
break;
}
}
}
foreach (page in sort_array(keys(changes_pages), 1)) {
ret += sprintf("%-30s changed by %s\n", page,
query_multiple_short(changes_pages[page]));
}
return ret;
} /* find_changes() */
/**
* This method finds the specified file and shows it to us.
* @param fname the file name to find
* @return the text of the file, 0 if the file is not found
*/
string query_file(string fname) {
if (strsrch(fname, ".") > 0) {
fname = "/twiki/data/" + replace_string(fname, ".", "/") + ".txt";
} else {
fname = "/twiki/data/Main/" + fname + ".txt";
}
if (sizeof(stat(fname))) {
return read_file(fname);
}
return 0;
} /* query_file() */
/** @ignore yes */
void do_check_changes() {
BOARD_HAND->add_message("creator", "Twiki Database",
"Changes in the Twiki database",
find_changes(_last_check));
_last_check = time();
save_object(SAVE_FILE);
call_out("do_check_changes", _last_check + CHECK_TIME - time());
} /* do_changes() */