Zesstra | 83f011d | 2016-04-24 20:09:05 +0200 | [diff] [blame] | 1 | #pragma strict_types, save_types, rtt_checks, pedantic |
| 2 | #pragma no_clone, no_shadow, no_inherit |
| 3 | |
| 4 | inherit __DIR__"i_service"; |
| 5 | |
| 6 | #include <intermud.h> |
| 7 | #include <regexp.h> |
| 8 | #include <living/comm.h> |
| 9 | #include <defines.h> |
| 10 | |
| 11 | // we received a reply to one of our messages. |
| 12 | // Note: if response is 0, the peer did not respond (timeout)... |
| 13 | protected void recv_tell_reply(int id, mapping request, mapping response) |
| 14 | { |
| 15 | if(response) |
| 16 | { |
| 17 | if (stringp(response[RECIPIENT])) |
| 18 | { |
| 19 | object ob = find_player(response[RECIPIENT]) |
| 20 | || find_object(response[RECIPIENT]); |
| 21 | if (ob) |
| 22 | { |
| 23 | currentname = capitalize(data[SENDER])+"@"+capitalize(data[NAME]); |
| 24 | ob->ReceiveMsg(regreplace(response[DATA],"[:^print:]|\n","",1), |
| 25 | MT_COMM|MT_FAR, MA_TELL, 0, ME); |
| 26 | currentname = 0; |
| 27 | } |
| 28 | } |
| 29 | else |
| 30 | { |
| 31 | // no response, timeout... |
| 32 | if (request[SENDER] && stringp(request[SENDER])) |
| 33 | { |
| 34 | object ob = find_player(request[SENDER]) |
| 35 | || find_object(request[SENDER]); |
| 36 | if (ob) |
| 37 | ob->ReceiveMsg("Das Mud \'" + request[NAME] + |
| 38 | "\' konnte nicht erreicht werden.\n", |
| 39 | MT_NOTIFICATION, MA_TELL, Name(0), ME); |
| 40 | } |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | // we received an intermud tell message |
| 45 | protected void recv_tell(mapping data) |
| 46 | { |
| 47 | object ob; |
| 48 | string msg; |
| 49 | |
| 50 | if (data[RECIPIENT] && |
| 51 | (ob = find_player(lower_case(data[RECIPIENT]))) && |
| 52 | interactive(ob)) |
| 53 | { |
| 54 | if (!stringp(data[SENDER]) || !sizeof(data[SENDER])) |
| 55 | data[SENDER]="<Unknown>"; |
| 56 | |
| 57 | currentname = data[SENDER] + +"@"+data[NAME]; |
| 58 | |
| 59 | if (!stringp(data[DATA]) || !sizeof(data[DATA])) |
| 60 | msg="<Nichts>"; |
| 61 | else |
| 62 | msg= regreplace(data[DATA],"[:^print:]|\n","",1); |
| 63 | |
| 64 | message_prefix=capitalize(data[SENDER])+"@"+data[NAME]+ |
| 65 | " teilt Dir mit: "; |
| 66 | |
| 67 | int ret = ob->ReceiveMsg(msg, MT_COMM|MT_FAR, |
| 68 | MA_TELL, message_prefix, ME); |
| 69 | currentname = 0; |
| 70 | |
| 71 | // Wenn Empfaenger unsichtbar ist, bekommt der Absender immer die gleiche |
| 72 | // Meldung, egal was das Ergebnis von ReceiveMsg() ist. |
| 73 | if (ob->QueryProp(P_INVIS)) |
| 74 | { |
| 75 | msg ="\nRoot@"MUDNAME": Spieler "+ |
| 76 | capitalize(data[RECIPIENT])+ |
| 77 | " finde ich in "MUDNAME" nicht!\n"; |
| 78 | } |
| 79 | // Sonst kriegt er eine sinnvolle Angabe. |
| 80 | else |
| 81 | { |
| 82 | switch(ret) |
| 83 | { |
| 84 | case MSG_DELIVERED: |
| 85 | msg = break_string(data[DATA], 78, |
| 86 | "Du teilst "+capitalize(data[RECIPIENT]) + "@" |
| 87 | LOCAL_NAME + " mit: "); |
| 88 | if(ob->QueryProp(P_AWAY)) |
| 89 | msg=sprintf("%s%s@"MUDNAME" ist gerade nicht da: %s\n", |
| 90 | msg, ob->name(WER),ob->QueryProp(P_AWAY)); |
| 91 | else if ((i=query_idle(ob))>=600) |
| 92 | { // 10 Mins |
| 93 | string away; |
| 94 | if (i<3600) |
| 95 | away=time2string("%m %M",i); |
| 96 | else |
| 97 | away=time2string("%h %H und %m %M",i); |
| 98 | msg = sprintf("%s%s@"MUDNAME" ist seit %s voellig untaetig.\n", |
| 99 | msg, ob->Name(WER), away); |
| 100 | } |
| 101 | break; |
| 102 | case MSG_BUFFERED: |
| 103 | msg= ob->Name(WER) + " moechte gerade nicht gestoert werden." |
| 104 | "Die Mitteilung wurde von einem kleinen Kobold in Empfang " |
| 105 | "genommen. Er wird sie spaeter weiterleiten!"; |
| 106 | break; |
| 107 | case MSG_IGNORED: |
| 108 | case MSG_VERB_IGN: |
| 109 | case MSG_MUD_IGN: |
| 110 | msg = ob->Name(WER) + " hoert gar nicht zu, was Du sagst."; |
| 111 | break; |
| 112 | case MSG_SENSE_BLOCK: |
| 113 | msg = ob->Name(WER) + " kann Dich leider nicht wahrnehmen."; |
| 114 | break; |
| 115 | case MSG_BUFFER_FULL: |
| 116 | msg = ob->Name(WER) + " moechte gerade nicht gestoert werden." |
| 117 | "Die Mitteilung ging verloren, denn der Kobold kann sich " |
| 118 | "nichts mehr merken!"; |
| 119 | break; |
| 120 | default: |
| 121 | msg = ob->Name(WER) + " hat Deine Nachricht leider nicht " |
| 122 | "mitbekommen."; |
| 123 | break; |
| 124 | } |
| 125 | } |
| 126 | } |
| 127 | // Spieler nicht gefunden. |
| 128 | else |
| 129 | msg ="\nRoot@"MUDNAME": Spieler "+ |
| 130 | capitalize(data[RECIPIENT])+ |
| 131 | " finde ich in "MUDNAME" nicht!\n"; |
| 132 | |
| 133 | INETD->send(data[NAME], |
| 134 | ([REQUEST: REPLY, RECIPIENT: data[SENDER], |
| 135 | ID: data[ID], |
| 136 | DATA: msg]), 0); |
| 137 | |
| 138 | } |
| 139 | |
| 140 | public int send(string name, string mud, string msg) |
| 141 | { |
| 142 | return INETD->send(mud, |
| 143 | ([REQUEST: "tell", RECIPIENT: name, |
| 144 | SENDER: getuid(previous_object()), |
| 145 | DATA: msg |
| 146 | ]), #'recv_tell_reply); |
| 147 | } |
| 148 | |
| 149 | protected void create() |
| 150 | { |
| 151 | INETD->register_service("tell", #'recv_tell); |
| 152 | } |
| 153 | |
| 154 | public varargs int remove(int silent) |
| 155 | { |
| 156 | INETD->unregister_service("tell"); |
| 157 | destruct(this_object()); |
| 158 | } |
| 159 | |
| 160 | |