blob: c7218e011bb0b61c53399cf88984a2b2fc89bcaf [file] [log] [blame]
Zesstra83f011d2016-04-24 20:09:05 +02001#pragma strict_types, save_types, rtt_checks, pedantic
2#pragma no_clone, no_shadow, no_inherit
3
4inherit __DIR__"i_service";
5
6#include <intermud.h>
7#include <regexp.h>
8#include <living/comm.h>
9#include <defines.h>
10#include <daemon/mand.h>
11
12#define INETD_MANPAGE_FOUND "[ManD@%s] Folgende Seite wurde gefunden: %s\n"
13// mud file
14#define INETD_NO_MANPAGE "[ManD@%s] Keine Hilfeseite gefunden fuer '%s'.\n"
15// mud page
16#define INETD_MANPAGES "[ManD@%s] Die folgenden Seiten passen:\n" \
17 "%'-'78.78s\n%s%'-'78.78s\n"
18// mud "" pagelist ""
19#define INETD_MAN_REQUESTED "%s@%s: Abfrage abgeschickt.\n"
20// page mud#ifndef LOCAL_NAME
21
22#define LOCAL_NAME "MorgenGrauen"
23
24// we received a reply to one of our requests.
25// Note: if response is 0, the peer did not respond (timeout)...
26protected void recv_reply(int id, mapping request, mapping response)
27{
28 if(response)
29 {
30 if (stringp(response[RECIPIENT]))
31 {
32 object ob = find_player(response[RECIPIENT])
33 || find_object(response[RECIPIENT]);
34 if (ob)
35 {
36 ob->ReceiveMsg(regreplace(response[DATA],"[:^print:]|\n","",1),
37 MT_NOTIFICATION, "hilfe", 0, ME);
38 }
39 }
40 else
41 {
42 // no response, timeout...
43 if (request[SENDER] && stringp(request[SENDER]))
44 {
45 object ob = find_player(request[SENDER])
46 || find_object(request[SENDER]);
47 if (ob)
48 ob->ReceiveMsg("Das Mud \'" + request[NAME] +
49 "\' konnte nicht erreicht werden.\n",
50 MT_NOTIFICATION, "hilfe", "remote man: ", ME);
51 }
52 }
53}
54
55// we received an intermud manpage request
56protected void recv_request(mapping data)
57{
58 string manpage = data[DATA];
59 string *tmp = explode(manpage,"/");
60 if (sizeof(tmp)>1)
61 {
62 if (file_size(MAND_DOCDIR+manpage)>=0)
63 tmp=({tmp[<1], manpage});
64 else
65 tmp=({});
66 }
67 else
68 tmp=(string *)call_other(MAND,"locate",data[DATA],0);
69 // Gilden ausfiltern
70 mapping pages = ([]);
71 int index=sizeof(tmp);
72 while(index--)
73 {
74 if (tmp[1][0..1]!="g.") pages[tmp[index]]=tmp[index-1];
75 index--;
76 }
77 string ret;
78 switch(sizeof(pages))
79 {
80 case 0:
81 ret=sprintf(INETD_NO_MANPAGE,LOCAL_NAME,manpage);
82 break;
83 case 1:
84 tmp=m_indices(pages)[0];
85 ret=sprintf(INETD_MANPAGE_FOUND,LOCAL_NAME,pages[tmp]);
86 index=0;
87 while(manpage=read_file(MAND_DOCDIR+tmp,index))
88 {
89 ret+=manpage;
90 index+=MAX_READ_FILE_LEN;
91 }
92 break;
93 default:
94 ret=sprintf(INETD_MANPAGES,LOCAL_NAME,"",
95 break_string(implode(m_values(pages)," "),78),"");
96 break;
97 }
98 INETD->send(data[NAME],
99 ([REQUEST: REPLY, RECIPIENT: data[SENDER], ID: data[ID],
100 DATA: ret
101 ]),
102 0);
103}
104
105// Old interface. Request remote man page via intermud
106public string send_request(string mudname, string pagename)
107{
108 if (request(mudname, pagename))
109 return sprintf(INETD_MAN_REQUESTED,pagename,mudname);
110
111 return "Fehler beim Anfordern.\n";
112}
113
114