📄 advertisment.c
字号:
// Written by BBX workgroup
// Release: 2004/5/29
// 功能:自动广告
// 广告功能表
mapping advers = ([
"content" : "你好,这里是自动广告:\n" +
"1. 什么是自动广告\n" +
"2. ...\n" +
"0. 返回上一级\n",
"1" : ([
"content" : "你好,自动广告是....\n" +
"0. 返回上一级\n"
]),
]);
// 当前选择对象
// 关键字:名字
// 值:([ "time" : 最后刷新时间,
// "ack" : 最后应答信息,
// "fail_times" : 连续选择失败的次数
// "menu" : ({ 当前菜单, 上一级菜单, 上上一级菜单 ..... })
// ])
mapping selections = ([ ]);
// 接收到了用户的密语选择
void on_receive_message(string org, string msg)
{
mapping cur_menu;
string peer_name, pure_msg;
if (org == MSG_LISTEN)
{
sscanf(msg, "%s=> %s", &peer_name, &pure_msg);
if (! is_mapping(cur_menu = selections[peer_name]))
{
// 没有上次对话的信息,初始化信息
cur_menu = ([ "time" : time(), "ack" : "", "menu" : ({ advers }) ]);
selections[peer_name] = cur_menu;
}
pure_msg = trim(pure_msg);
// 更新时间和最后一次应答的信息
cur_menu["time"] = time();
cur_menu["ack"] = pure_msg;
printf("User %s send command %s\n", peer_name, pure_msg);
if (pure_msg == "0")
{
// 返回上一级
if (sizeof(cur_menu["menu"]) <= 1)
{
// 已经到了顶级
tell(peer_name, "谢谢关注,再见");
return;
}
// 退回一级
cur_menu["menu"] = cur_menu["menu"][1..<1];
tell_msgs(peer_name, cur_menu["menu"][0]["content"]);
selections[peer_name] = cur_menu;
return;
}
if (! is_mapping(cur_menu["menu"][0][pure_msg]))
{
// 检查连续发送的错误信息次数
cur_menu["fail_times"] = (int) cur_menu["fail_times"] + 1;
if (cur_menu["fail_times"] > 3)
{
// 重复发送多次,可能是自动应答
printf("Received too many duplicated messages. Remove %s.\n", peer_name);
set_timer(2, 0, "map_delete", selections, peer_name);
}
// 没有这个选择,重新提示当前菜单
tell_msgs(peer_name, "错误的选择\n" + cur_menu["menu"][0]["content"]);
return;
}
// 新选择了子菜单,添加新的选择
cur_menu["fail_times"] = 0;
cur_menu["menu"] = ({ cur_menu["menu"][0][pure_msg] }) + cur_menu["menu"];
tell_msgs(peer_name, cur_menu["menu"][0]["content"]);
selections[peer_name] = cur_menu;
}
}
// 人物出现,准备发送广告
void on_char_appear(mapping ob)
{
if (ob["type"] == OBJECT_TYPE_CHAR && ob["id"] != my_id())
{
// 等待 1 秒钟再检查(等待接收用户名字)
set_timer(1, 0, "check_char", ob["id"]);
}
}
// 判断是否需要发送广告
void check_char(int id)
{
mapping ob;
mapping cur_menu;
if (! is_mapping(ob = all_objects[id]) || ! ob["got_name"])
{
// 没有此人物的信息或者未取得名字
return;
}
if (is_mapping(cur_menu = selections[ob["name"]]) &&
time() - cur_menu["time"] < 30)
{
// 30 秒以内向此人发送过信息
return;
}
// 发送广告信息
tell_msgs(ob["name"], advers["content"]);
selections[ob["name"]] = ([ "time" : time(), "ack" : "", "menu" : ({ advers }) ]);
}
// 进入世界
void on_enter_world()
{
delete_thread("tcheck");
create_thread(0, "tcheck");
}
// 定期扫描当前选项,取消超时选项
void tcheck()
{
mapping cur_menu;
array ks;
int i;
for (;;)
{
sleep(1);
ks = keys(selections);
for (i = 0; i < sizeof(ks); i++)
{
cur_menu = selections[ks[i]];
if (time() - cur_menu["time"] > 60)
// 60秒没有访问
map_delete(selections, ks[i]);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -