fingerd.c
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 284 行
C
284 行
// fingerd.c
// change for netplay@CCTX
#include <net/dns.h>
#include <mudlib.h>
int query_only_ip(object *ob);
//add by jackyboy for finger display!
int online_time(object);
int online_time_total(object);
void create() { seteuid( getuid() ); }
string age_string(int time)
{
int month, day, hour, min, sec;
sec = time % 60;
time /= 60;
min = time % 60;
time /= 60;
hour = time % 24;
time /= 24;
day = time % 30;
month = time / 30;
return (month?month + "m":"") + (day?day + "d":"") +
(hour?hour + "h":"") + min + "m";
}
int online_time(object body)
{
return time() - (int)body->query_temp("temp_time");
}
int online_time_total(object body)
{
return body->query("time_aged")+time()-(int)body->query_temp("temp_time");
}
string finger_all()
{
object *ob;
string msg, fip,*str;
int i,ips;
//ob = users();
ob = sort_array(users(), "ip_name", this_object());
msg = "";
if ( !wizardp(this_player()) ) // player finger
{
for(i=0; i<sizeof(ob); i++) {
if( this_player() && !this_player()->visible(ob[i]) ) continue;
msg = sprintf("%s%-14s%-14s%-14s\n",
msg, ob[i]->query("name"), ob[i]->query("id"),
query_idle(ob[i]) + "s");
}
return "◎ "+CHINESE_MUD_NAME+" ◎\n" +
"——————————————————\n"
+ "姓名 帐号 发呆\n" +
"——————————————————\n"
+ msg +
"——————————————————\n";
} else // wizard finger
{
for(i=1; i<sizeof(ob); i++) {
if( this_player() && !this_player()->visible(ob[i]) ) continue;
msg = sprintf("%s%-14s%-14s%-14s%-7s%s\n",
msg, ob[i]->query("name"), ob[i]->query("id"),
age_string( (int)ob[i]->query("mud_age")),
query_idle(ob[i]) + "s", wizardp(ob[i])?"未知":query_ip_number(ob[i]));
// query_idle(ob[i]) + "s", query_ip_name(ob[i]));
}
ips=query_only_ip(ob);
return "◎ "+CHINESE_MUD_NAME+" ◎\n" +
"—————————————————————————————————————\n"
+ "姓名 帐号 年龄 发呆 连线\n" +
"—————————————————————————————————————\n"
+ msg +
"—————————————————————————————————————\n"
+"排除由同一IP登录的人后,实际有:"+ips+"人\n";
}
}
string finger_user(string name)
{
object ob, body;
string msg, mud;
string wiz_status;
int public_flag;
//本函数由JackyBoy重新编写并优化!
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( objectp(body = find_player(name)) && geteuid(body)==name )
{
if(wizardp(this_player()))
public_flag=1;
else
public_flag =body->query("env/public")?1:0;
}
else
{
if( !ob)
return "没有这个玩家。\n";
body = LOGIN_D->make_body(ob);
if( !body)
return "没有这个玩家。\n";
if( !body->restore() )
return "没有这个玩家。\n";
if(wizardp(this_player()))
public_flag=1;
else
public_flag =body->query("env/public")?1:0;
destruct(body);
}
msg = sprintf("\n英文代号:\t%s\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),
public_flag?ob->query("email"):"不告诉你",
"("+(wizardp(this_player(1))?ob->query("last_from"):"未知")+") "+
ctime(ob->query("last_on")));
if(!ob->query("profile")||ob->query("profile")=="")
msg+="没有自我介绍。\n\n";
else
msg+=ob->query("profile")+"\n\n";
if( objectp(body = find_player(name)) && geteuid(body)==name &&
this_player()->visible(body))
{
wiz_status = SECURITY_D->get_status(body);
if( wiz_status != "(admin)" && wiz_status != "(arch)" )
{
msg += sprintf("\n%s目前正从%s连线中。\n", body->name(1),
wizardp(this_player(1))?query_ip_number(body):"未知");
}
else
{ wiz_status = SECURITY_D->get_status(this_player(1));
if( wiz_status == "(admin)")
{
msg += sprintf("\n%s目前正从%s连线中。\n", body->name(1),
wizardp(this_player(1))?query_ip_number(body):"未知");
}
else msg += sprintf("\n%s目前正从保密处连线中。\n", body->name(1));
}
}
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"),
"未知",
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"),
wizardp(this_player(1))?ob->query("last_from"):"Unknow",
ctime(ob->query("last_on")));
if(!ob->query("profile")||ob->query("profile")=="")
msg+="没有自我介绍。\n\n";
else
msg+=ob->query("profile")+"\n";
if( body = find_player(name) ) {
if( !this_player() || this_player()->visible(body) )
{
if(chinese_flag)
{
msg+="\n" + ob->query("name") + "目前正在连线。\n";
}
else
msg+="\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;
}
string get_killer()
{
int i;
string msg;
object *ob = users();
msg = "";
for (i = 0; i < sizeof(ob); i++)
if ((int)ob[i]->query_condition("killer"))
msg += (ob[i]->short() + "\n");
if (msg == "")
return "本城治安良好。\n";
else
return "现在本城正在缉拿以下人犯:\n\n" + msg;
}
/*
string get_win_mengzhu()
{
int i;
object mengzhu, *ob = users();
string name;
mengzhu = load_object("/clone/npc/meng-zhu");
name = mengzhu->query("winner");
for (i = 0; i < sizeof(ob); i++)
if ((int)ob[i]->query("win_mengzhu")> 0) {
if ( ob[i]->query("id") != name ) {
(int)ob[i]->delete("win_mengzhu");
} else { return 0;}
} else { return 0;}
}*/
//以下函数排除同一个IP连线的
//write by JackyBoy@CuteRabbits Studio for CCTX 1999/4/9
int query_only_ip(object *ob)
{
int i,j,k,count,total;
total=sizeof(ob);
for ( i=0; i<sizeof(ob); i++)
{
count=1;k=sizeof(ob);
for (j=0; j<k;j++)
if ( j!=i && query_ip_name(ob[i])==query_ip_name(ob[j]) )
{
ob=ob-({ob[j]});
count++;
k=sizeof(ob);
}
total=total-count+1;
}
return total;
}
int ip_name(object ob1, object ob2)
{
string name1, name2;
name1 = query_ip_name(ob1);
name2 = query_ip_name(ob2);
if (intp(name1)) name1 = "";
if (intp(name2)) name2 = "";
if (name1 > name2) return -1;
if (name1 < name2) return 1;
return (int)ob2->query("combat_exp") - (int)ob1->query("combat_exp");
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?