//BBB 09/25/1999
//让玩家不会漏过任何重要新闻，也不要长途跋涉去看巫师公告版。
// Modify by snowman@SJ for new_list when login.
// Modified By Numa@SJ 2000.3.31 For write all to player
// Modified By bbb@SJ 2000.11.03 For Mysql
// Modified by snowman@SJ 19/12/2000 for faster speed.

#include <ansi.h>
#include <net/dns.h>
#include <mudlib.h>

#define Data_Base_Online

#define NEWS_DIR       "/data/"
#define NEWS_FILENAME  "news"
#define NEWS_TITLE  "\n━━━━━━━━━━━━━━ "HIY"书剑网络游戏新闻列表"NOR" ━━━━━━━━━━━━━━\n"
#define NEWS_END  "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
#define NEWS_P HIY"书剑新闻系统："NOR

inherit F_SAVE;

static object ob = 0;
static int status=0;
static string msg,subject;

mapping *notes;

string query_save_file()
{
	return NEWS_DIR + NEWS_FILENAME ;
}

void tell_me(string msg)
{
	if (objectp(ob)) tell_object(ob, msg);
}

void done_post(object me,mapping note, string text)
{
	int i;
	note["msg"] = text;
	i = sizeof(notes);
	if( !pointerp(notes) || !sizeof(notes) )
		notes = ({ note });
	else
		notes += ({ note });
	note["time"] = time();
	tell_object(me, NEWS_P + HIM "新闻发布完毕。如有必要，请发布到主页，使用方法看 help news\n"NOR);
//	message("system",HIW"\n\n【新闻】发布书剑游戏新闻，请用 news 查看，使用方法 help news\n\n"NOR, users());
	save();
	return;
}

void list_news(object me, int login)
{
	int i = 0, ulogin, j = 0;
	string str;

	if (sizeof(notes) < 1)
		write("没有任何新闻。\n");
	else {
		ulogin = me->query("last_news");
		str = NEWS_END;
		foreach (mapping item in notes) {
			i++;
			if (ulogin < item["time"]) {
				if (j++ < 15)
					str = sprintf("%3d) %-=40s %18s (%s)\n%s",
						i, item["title"],
						wizardp(me)?item["poster"]+"("+capitalize(item["author"])+")":"",
						ctime(item["time"])[0..9], str
					);
			}
		}
		if (!j)
			write("目前没有新发布的新闻。\n");
		else {
			if (login && j > 5)
				;
			else
				write(NEWS_TITLE + str);
			write(NEWS_P+"目前共有 "+ i +" 条新闻、"+ j +" 条未读。\n");
			write("请用 news 阅读标题，或者 news new|next|编号 阅读详细内容。\n");
		}
	}
}

void list_allnews(object me)
{
	int i;
	string str;

	i = sizeof(notes);
	if ( i < 1) {
		write(NEWS_P +"没有任何新闻。\n");
		return;
	}
	str = NEWS_TITLE;
	while( i-- )
		str += sprintf("%3d) %-=40s %18s (%s) \n",
			i+1, notes[i]["title"], wizardp(me)?notes[i]["poster"]+"("+capitalize(notes[i]["author"])+")":"",
			ctime(notes[i]["time"])[0..9] );
	str += NEWS_END;
	me->start_more(str);
}

void create()
{
	seteuid(getuid());
	restore();
	call_out("create", 900);
}

int main(object me, string arg)
{
	mapping note;
	string s,arg1;
	int num = -1;

#ifdef Data_Base_Online
	int mysql,rows;
	string forum;
#endif

	if (!arg) {
		list_news(me, 0);
		return 1;
	}

	if (sscanf(arg, "%s", s) == 1) {
		if ( s == "all" ) {
			list_allnews(me);
			return 1;
		}
		if ( s == "post" ){
			if( wiz_level(me)<3 )
				return notify_fail(NEWS_P +"只有巫师才可以发布消息。 \n");
			else 	return notify_fail("使用方法： news post <主题> \n");
		}
		if ( s == "delete" ){
			if( wiz_level(me)<3 )
				return notify_fail(NEWS_P +"只有巫师才可以删除消息。 \n");
			else	return notify_fail("使用方法： news delete <编号> \n");
		}
	}

	if (sscanf(arg, "post %s", arg1) == 1) {
		if ( wiz_level(me)<3 )
			return notify_fail(NEWS_P +"只有巫师才可以发布消息。 \n");
		if ( strlen(arg1)< 8 || strlen(arg1)>40 )
			return notify_fail(NEWS_P +"请简明扼要地说明主题，主题字数必须在4-20之间，禁止使用口头语言。 \n");
		else note = allocate_mapping(5);
		note["title"] = arg1;
		note["author"] = getuid(me);
		note["poster"] = me->query("name");
		me->edit( (: done_post, me, note :) );
		return 1;
	}

	if (sscanf(arg, "delete %d", num)== 1) {
		if ( wiz_level(me)<3 )
			return notify_fail(NEWS_P +"只有巫师才可以删除消息。 \n");
		if( !arrayp(notes) || num < 1 || num > sizeof(notes) )
			return notify_fail(NEWS_P +"没有这个编号的新闻。\n");
		else num--;
		notes = notes[0..num-1] + notes[num+1..<1];
		save();
		write(NEWS_P +"删除第 " + (num+1) + " 号新闻....Ok。如果此新闻被发布过主页，请去主页删除。\n");
		return 1;
	}

	if (arg == "new" || arg == "next") {
		int ulogin = me->query("last_news");

		num = sizeof(notes);
		while (num--)
			if (ulogin >= notes[num]["time"])
				break;
		num+=2;
	}

	if (num+1 || sscanf(arg, "%d", num) == 1) {
		int size = sizeof(notes);

		if (!size)
			return notify_fail(NEWS_P +"没有任何新闻。\n");
		if (num < 1 || num > size)
			return notify_fail(NEWS_P +"没有这个编号的新闻。\n");
		num--;
		me->start_more(sprintf("%d) %-=43s %8s(%s)(%s)\n"+NEWS_END,
			num + 1, notes[num]["title"],
			wizardp(me)?notes[num]["poster"]:"",
			wizardp(me)?notes[num]["author"]:"News",
			ctime(notes[num]["time"])[0..15]) + notes[num]["msg"]
		);
		if (me->query("last_news") < notes[num]["time"])
			me->set("last_news", notes[num]["time"]);
		return 1;
	}

// send to web site.
#ifdef Data_Base_Online
	if (sscanf(arg, "send %d %s", num,forum)== 2) {
		if( !pointerp(notes) || !sizeof(notes) )
			return notify_fail(NEWS_P +"没有任何新闻。\n");
		if( num < 1 || num > sizeof(notes) )
			return notify_fail(NEWS_P +"没有这个编号的新闻。\n");
		num--;
		if ( wiz_level(me)<3 )
			return notify_fail(NEWS_P +"只有 wizard 以上才可以发布新闻到主页。 \n");
		if (forum != "info" && forum != "shaolin"
		&& forum != "huashan" && forum != "taohua"
		&&  forum != "tiezhang" && forum != "shenlong"
		&&  forum != "songshan" && forum != "xueshan"
		&&  forum != "gumu" && forum != "murong"
		&&  forum != "mingjiao" && forum != "gaibang"
		&&  forum != "tianlong" && forum != "wudang"
		&& forum != "xingxiu" && forum != "emei"
		&& forum != "sh" && forum != "qhd"
		&& forum != "yt" && forum != "zj"
		&& forum != "sd" && forum != "hb"
		&& forum != "gz" && forum != "ln"
		&& forum != "dd" && forum != "cdedu"
		)
			return notify_fail(NEWS_P +"主页社区没有 "+forum+" 这个论坛。请用 help news 查看\n");

//hxsd修改
/*		mysql = db_connect("localhost", "mud", "root");
		if (intp(mysql)) {
			msg = ( sprintf("[%d] %-=31s %18s (%s)\n" + NEWS_END,
				num + 1, notes[num]["title"], " ",
				ctime(notes[num]["time"])[0..15]) + notes[num]["msg"] );
			subject = ( sprintf("%s",notes[num]["title"]) );
			rows = db_exec(mysql, "insert into Posts set
				B_Board='"+forum+"',
				B_Posted = '"+notes[num]["time"]+"',
				B_Last_Post = '"+notes[num]["time"]+"',
				B_Username='wizard',
				B_IP= '202.97.175.44',
				B_Subject='"+subject+"',
				B_Body='"+msg+"',
				B_Icon='book.gif'");
			db_close(mysql);
			if (intp(rows)) {
				num++;
				return notify_fail(NEWS_P +"news "+num+" 发送完毕。\n");
			}
			return notify_fail(NEWS_P +"发送失败，详细信息为：\n"+rows+"\n请通知 bbb 解决此问题。\n");
		}
*/
		return notify_fail(NEWS_P +"只可以在总站发送新闻，假如你是在总站，目前数据库无法连接，请通知 bbb。\n");
	}
#endif

	if ( arg == "write all" ) {
		if (!wizardp(me))
			return notify_fail("这是巫师命令。\n");
		if( !pointerp(notes) || !sizeof(notes) )
			return notify_fail(NEWS_P +"没有任何新闻。\n");
		msg = NEWS_TITLE;
		for (num=0;num<sizeof(notes);num++) {
			msg += sprintf(HIW"%d"NOR") %-=43s %8s(%s)(%s)\n"+NEWS_END,num + 1, notes[num]["title"],
				wizardp(me)?notes[num]["poster"]:"",wizardp(me)?notes[num]["author"]:"",
				ctime(notes[num]["time"])[0..15]) + notes[num]["msg"] + "\n\n";
		}
		me->start_more(msg);
		return 1;
	}

}

int help(object me)
{
	if (!wiz_level(me) )
	write(@HELP
指令格式 :
news		查看最近十五条未读的新闻列表。
news all	查看全部新闻列表。
news new|next	查看最近一条未读新闻的详细内容。
news <编号>	查看此编号新闻的详细内容。

发布内容主要为：系统公告、程序改动、武林大事。
HELP);

	else
	write(@HELP
指令格式 :
news				查看最近十五条未读的新闻列表。
news all			查看全部新闻列表。
news new|next			查看最近一条未读新闻的详细内容。
news <编号>			查看此编号新闻的详细内容。
news post <主题>		发布新闻，wizard 级别以上巫师专用
news delete <编号>		删除新闻，wizard 级别以上巫师专用
news write all			列出全部 news 的详细内容
news send <编号> <论坛ID>	发送新闻到主页，可以选择不同的讨论区发送

论坛ID如下：系统公告(info) 少林(shaolin)  武当(wudang)
华山(huashan) 桃花(taohua) 铁掌(tiezhang) 神龙(shenlong)
星宿(xingxiu) 峨嵋(emei)   嵩山(songshan) 雪山(xueshan)
古墓(gumu)    慕容(murong) 明教(mingjiao) 丐帮(gaibang) 天龙(tianlong)
分站论坛分别为：ln sh qhd zj hb sd yt dd gz cdedu

发送举例：news send 122 info

注意：  1、发布内容主要为：系统公告、程序改动、武林大事。
	2、未经确实的消息严禁发布，虚假新闻立即删除。
	3、重大程序变动，如可能涉及玩家，必须用此发布通告，且以此为准。
	4、新闻发布涉及全局的，必须发布在info，针对门派的发两次到info和门派区,针对分站的发两次到info和分站区
	5、注意发布时主题明确，不要含糊不清，不要使用口头语言。
HELP);
	return 1;
}
