fingerd1.c

来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 146 行

C
146
字号
// fingerd.c

#include <net/dns.h>

void create() { seteuid( getuid() ); }

string age_string(int time)
{
	int month, day, hour;

	time /= 3600;
	hour = time % 24;
	time /= 24;
	day = time % 30;
	month = time / 30;
	return (month?month + "月":"") + (day?day + "天":"") + hour + "小时";
}

string finger_all(int showage)
{
	object *ob;
	string msg;
	int i;

	ob = sort_array(users(),"sort_user",this_object());
	msg = "";
	for(i=0; i<sizeof(ob); i++) {
		if( this_player() && !this_player()->visible(ob[i]) ) continue;
		if( showage)
		msg = sprintf("%s%-10s  %-8s  %-15s (%s) %s\n",
			msg, ob[i]->query("name"), ob[i]->query("id"),
			age_string( (int)ob[i]->query("mud_age")), 
			query_ip_number(ob[i]),query_ip_name(ob[i]) );
		else
                msg = sprintf("%s%-20s  %-20s   \n",
                        msg, ob[i]->query("name"), ob[i]->query("id"),
                        );

	}
	return msg;
}

string finger_user(string name, int wizship)
{
	object ob, body;
	string msg="", mud;

	if( sscanf(name, "%s@%s", name, mud)==2 ) {
		GFINGER_Q->send_finger_q(mud, name, this_player(1));
		return "网路指令传送过程可能需要一些时间,请稍候。\n";
	}

	ob = new(LOGIN_OB);
	ob->set("id", name);
	if( !ob->restore() ) return "没有这个玩家。\n";
	if( wizship ) {
        if( objectp(body = find_player(name)) && geteuid(body)==name ) {
                msg = sprintf("\n%s目前正在从 %s 连线中。\n", body->name(1),
                        query_ip_name(body));
        }
	msg +=  sprintf("\n英文代号:\t%s\n姓    名:\t%s\n权限等级:\t%s\n"
		"电子邮件地址:\t%s\n上次连线地址:\t%s( %s )\n"
		"合计在线时间:\t%s\n\n",
		ob->query("id"),
		ob->query("name"),
		SECURITY_D->get_status(name),
		ob->query("email"),
		ob->query("last_from"),
		ctime(ob->query("last_on")),
	(body ?	(age_string( (int)body->query("mud_age"))) : "不告诉你")
	);
		    }
	else
	{
        if( objectp(body = find_player(name)) && geteuid(body)==name ) {
                msg = sprintf("\n%s目前正在连线中。\n", body->name(1),
                        ); }
        msg +=  sprintf("\n英文代号:\t%s\n姓    名:\t%s\n权限等级:\t%s\n"
                "上次连线时间:\t%s\n\n",
                ob->query("id"),
                ob->query("name"),
                SECURITY_D->get_status(name),
                ctime(ob->query("last_on"))
        );
		}
	destruct(ob);
	return msg;
}

varargs string remote_finger_user(string name, int chinese_flag)
{
	object ob, body;
	string msg;

	ob = new(LOGIN_OB);
	ob->set("id", name);
	if( !ob->restore() )
		return chinese_flag ? "没有这个玩家。\n" : "No such user.\n";
	if( chinese_flag ) msg =  sprintf(
		"\n英文代号:\t%s\n姓    名:\t%s\n权限等级:\t%s\n"
		"电子邮件地址:\t%s\n上次连线地址:\t%s( %s )\n\n",
		ob->query("id"),
		ob->query("name"),
		SECURITY_D->get_status(name),
		ob->query("email"),
		ob->query("last_from"),
		ctime(ob->query("last_on"))
	);
	else msg =  sprintf(
		"\nName\t: %s\nStatus\t: %s\nEmail\t: %s\nLastOn\t: %s( %s )\n\n",
		capitalize(ob->query("id")),
		SECURITY_D->get_status(name),
		ob->query("email"),
		ob->query("last_from"),
		ctime(ob->query("last_on"))
	);
	if( body = find_player(name) ) {
		if( !this_player() || this_player()->visible(body) )
			msg += chinese_flag ?
				("\n" + ob->query("name") + "目前正在线上。\n"):
				("\n" + capitalize(name) + " is currently connected.\n");
	}

	destruct(ob);
	return msg;
}

object acquire_login_ob(string id)
{
	object ob;

	if( ob = find_player(id) ) {
		// Check if the player is linkdead
		if( ob->query_temp("link_ob") )
			return ob->query_temp("link_ob");
	}
	ob = new(LOGIN_OB);
	ob->set("id", id);
	return ob->restore() ? ob : 0;
}
int sort_user(object a, object b)
{
return strcmp(query_ip_name(a), query_ip_name(b));
} 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?