/* * $Id: channel.c,v 1.13 2003/03/06 18:31:56 wodan Exp $ */ /* /daemon/services/channel.c * from the Nightmare IV LPC Library * handles intermud channels using the Intermud 3 protocols * created by Descartes of Borg 950625 * Modified for Discworld by Turrican 1-11-95 */ #define SERVICE_CHANNEL #define TALKER "/std/shadows/object/talker" #define HIST "/obj/handlers/hist_handler" string GetLocalChannel(string ch); void eventReceiveChannelWhoReply(mixed *packet) { object ob; if (file_name(previous_object()) != INTERMUD_D) { return; } if (!(ob = find_player(packet[5]))) { return; } packet[6] = GetLocalChannel(packet[6]); if (!sizeof(packet[7])) { tell_object(ob, "No one is listening to " + packet[6] + " at " + packet[2] + ".\n"); return; } tell_object(ob, "Listening to " + packet[6] + " at " + packet[2] + ": "); tell_object(ob, implode(packet[7], " ")+"\n"); } int filter_listeners(object ob, string chan) { if (!ob->query_creator() || ob->query_invis() || ob->check_earmuffs("intermud-all") || ob->check_earmuffs(GetLocalChannel(chan))) { return 0; } return 1; } void eventReceiveChannelWhoRequest(mixed *packet) { string *who; if (file_name(previous_object()) != INTERMUD_D) { return; } if (GetLocalChannel(packet[6])) { who = (string *)filter_array(users(), "filter_listeners", this_object(), packet[6])->query_cap_name(); } else { who = ({ }); } INTERMUD_D->eventExternWrite(({ "chan-who-reply", 5, mud_name(), 0, packet[2], packet[3], packet[6], who })); } void eventReceiveChannelUserRequest(mixed *packet) { object ob; string visname; int gender; if (file_name(previous_object()) != INTERMUD_D) { return; } if (!(ob = find_player(packet[6]))) { INTERMUD_D->eventExternWrite(({ "error", 5, mud_name(), 0, packet[2], 0, "unk-user", packet[6] + " is not a valid " "player.", packet }) ); return; } visname = (string)ob->query_cap_name(); switch ((string)ob->query_gender_string()) { case "male": gender = 0; break; case "female": gender = 1; break; default: gender = 2; break; } INTERMUD_D->eventExternWrite( ({ "chan-user-reply", 5, mud_name(), 0, packet[2], 0, packet[6], visname, gender })); } void eventReceiveChannelMessage(mixed *packet) { object *people, *things; if (file_name(previous_object()) != INTERMUD_D) { return; } if (packet[2] == mud_name() || !GetLocalChannel(packet[6])) { return; } // If it is orion and they have colour, tell them to stop using it. if (lower_case(packet[7]) == "orion" && strsrch(packet[8], "%^") != -1) { packet[8] = strip_colours(packet[8]); } // Perform any channel based filtering. ie: strip out all colours // on the DW chat line, but leave it open for others. switch( packet[6] ) { case "discworld-chat": case "discworld-cre": if ( strsrch( packet[8], "%^" ) != -1 ) { packet[8] = strip_colours( packet[8] ); } break; default: } people = filter(users(), (: $1->check_not_ignored($(packet[2])) && $1->check_not_ignored($(packet[7])) && $1->check_not_ignored($(packet[7]) + "@" + $(packet[2])) :)); packet[8] = replace(packet[8], ({ sprintf("%c", 7), "!", sprintf("%c", 27), "ESC" })); event(people, "intermud_tell", sprintf("%s@%s: ", packet[7], packet[2]), packet[8], GetLocalChannel((string)packet[6])); if ((string)packet[6] == "discworld-chat") { things = children(TALKER); things -= ({ find_object(TALKER) }); things->receive("intermud", sprintf("%s@%s", packet[7], packet[2]), packet[8]); HIST->add_chat_history( "intermud", sprintf( "%s wisped: ", packet[7] + "@" + packet[2] ), packet[8] ); } /* CHAT_D->eventSendChannel(packet[7] + "@" + packet[2], packet[6], packet[8]); */ } string clean_emote_string( string txt ) { int i = 0; txt = replace_string(txt, "$N", ""); while ( txt[i] == ' ' ) { i++; } txt = txt[i..]; return txt; } /* clean_emote_string() */ void eventReceiveChannelEmote(mixed *packet) { object *people, *things; if (file_name(previous_object()) != INTERMUD_D) { return; } if (packet[2] == mud_name()) { return; } if (!packet[7]) { return; } // ( "taffyd", "%s: %O\n", ctime(time()), packet ); switch( packet[6] ) { case "discworld-chat": case "discworld-cre": if ( strsrch( packet[8], "%^" ) != -1 ) { packet[8] = strip_colours( packet[8] ); } break; } people = filter(users(), (: $1->check_not_ignored($(packet[2])) && $1->check_not_ignored($(packet[7])) && $1->check_not_ignored($(packet[7]) + "@" + $(packet[2])) :)); packet[8] = replace(packet[8], ({ sprintf("%c", 7), "!", sprintf("%c", 27), "ESC" })); event(people, "intermud_tell", "", replace_string(packet[8], "$N", packet[7]+"@"+packet[2]), GetLocalChannel((string)packet[6])); if ((string)packet[6] == "discworld-chat") { things = children(TALKER); things -= ({ find_object(TALKER) }); things->receive("intermud", sprintf("%s@%s", packet[7], packet[2]), ":" + clean_emote_string( packet[8] ) ); } /* CHAT_D->eventSendChannel(packet[7] + "@" + packet[2], packet[6], packet[8], 1, 0, 0); */ } varargs void eventSendChannel(string who, string ch, string msg, int emote, string target, string targmsg) { mixed *packet; string targpl, where; if (emote) { if (target && targmsg) { if (sscanf(target, "%s@%s", targpl, where) != 2) { targpl = target; } where = mud_name(); } else { targpl = where = targmsg = 0; } packet = ({ "channel-e", 5, mud_name(), lower_case(who), 0, 0, ch, who, msg }); } else { packet = ({ "channel-m", 5, mud_name(), lower_case(who), 0, 0, ch, who, msg }); } INTERMUD_D->eventExternWrite(packet); } void eventSendChannelWhoRequest(string channel, string mud) { string pl; pl = (string)this_player(1)->query_name(); INTERMUD_D->eventExternWrite(({ "chan-who-req", 5, mud_name(), pl, mud, 0, channel })); } string GetLocalChannel(string channel) { switch (channel) { case "imud_code": return "intercre"; case "imud_gossip": return "intergossip"; case "discworld-cre": return "dwcre"; case "discworld-chat": return "dwchat"; } return 0; } void eventRegisterChannels(mapping list) { mixed *val; string channel, ns, local; if (file_name(previous_object()) != INTERMUD_D) { return; } ns = (string)INTERMUD_D->GetNameserver(); foreach (channel, val in list) { if (!val) { continue; } local = GetLocalChannel(channel); // // Don't try registering on channels we don't care about anyway. // if (!local) { //INTERMUD_D->eventExternWrite(({ "channel-listen", 5, mud_name(), 0, ns, //0, channel, 0 })); // log_file("channels", "New channel: " + local + " recognized " + // ctime(time()) + "\nValue: " + sprintf("%O", val) + "\n\n"); } else { INTERMUD_D->eventExternWrite(({ "channel-listen", 5, mud_name(), 0, ns, 0, channel, 1 })); } } } int eventAdministerChannel(string channel, string *additions, string *subs) { if (!((int)master()->high_programmer(geteuid(this_player(1))))) { return 0; } if (member_array(channel, (string *)INTERMUD_D->GetChannels()) == -1) { return 0; } INTERMUD_D->eventExternWrite(({ "channel-admin", 5, mud_name(), (string)this_player(1)->query_cap_name(), (string)INTERMUD_D->GetNameserver(), 0, channel, additions, subs })); return 1; } int AddChannel(string channel, int privee) { if (!((int)master()->high_programmer(geteuid(this_player(1))))) { return 0; } if (member_array(channel, (string *)INTERMUD_D->GetChannels()) != -1) { return 0; } INTERMUD_D->eventExternWrite(({ "channel-add", 5, mud_name(), (string)this_player(1)->query_cap_name(), (string)INTERMUD_D->GetNameserver(), 0, channel, privee })); return 1; } int RemoveChannel(string channel) { if (!((int)master()->high_programmer(geteuid(this_player(1))))) { return 0; } if (member_array(channel, (string *)INTERMUD_D->GetChannels()) == -1) { return 0; } INTERMUD_D->eventExternWrite(({ "channel-remove", 5, mud_name(), (string)this_player(1)->query_cap_name(), (string)INTERMUD_D->GetNameserver(), 0, channel })); return 1; }