blob: 7d3648ec66220b34c970f2136a4fc4d40f7af10a [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// newsclient.c -- Nachrichtenbretter
4//
5// $Id: newsclient.c 8349 2013-02-04 21:15:28Z Zesstra $
6
7/* 1992 JOF */
8#pragma strong_types
9#pragma save_types
10#pragma no_clone
11#pragma range_check
MG Mud User88f12472016-06-24 23:31:02 +020012
13inherit "/std/thing";
14inherit "/std/more";
15
16#include <config.h>
17#include <properties.h>
18#include <news.h>
19#include <wizlevels.h>
20#include <language.h>
21#include <defines.h>
22#include <input_to.h>
23
24string GROUP;
25string writer;
26string usemsg;
27
28void SetInUseMessage(string str)
29{
30 usemsg=str;
31}
32
33string SetGroup(string str)
34{
35 return GROUP=str;
36}
37
38protected void create()
39{
40 thing::create();
41 writer=="";
42
43}
44
45void thinginit() /* If someone doesnt want our add_action he may call this */
46{
47 thing::init();
48}
49
50varargs int remove(int silent)
51{
52 return thing::remove();
53}
54
Zesstra5b71ebb2018-03-07 20:50:35 +010055public varargs void init(object origin)
MG Mud User88f12472016-06-24 23:31:02 +020056{
Zesstra5b71ebb2018-03-07 20:50:35 +010057 thing::init(origin);
MG Mud User88f12472016-06-24 23:31:02 +020058 add_action("schreib","schreib",1);
59 add_action("lies","lies");
60 add_action("loesche","loesch",1);
61}
62
63string ladj(string str, int weite)
64{
65 return((str+" ")[0..weite-1]);
66}
67
68string QueryLong()
69{
70 mixed *messages;
71 string desc;
72 int i;
73
74 desc=QueryProp(P_LONG);
75 desc+="\n";
76 messages=NEWSSERVER->GetNotes(GROUP);
77 if (!pointerp(messages) || !sizeof(messages))
78 return desc+"Zur Zeit befinden sich keine Nachrichten am Brett.\n";
79 if (sizeof(messages)==1)
80 desc+="Zur Zeit befindet sich eine Nachricht am Brett:\n\n";
81 else
82 desc+="Zur Zeit befinden sich "+sizeof(messages)+" Nachrichten am Brett:\n\n";
83 for (i=0;i<sizeof(messages);i++)
84 {
85 if (i<9) desc+=" ";
86 desc+=""+(i+1)+". ";
87 desc+=(ladj(messages[i][M_TITLE],45)+" ("+
88 ladj(messages[i][M_WRITER]+",",13)+
89 dtime(messages[i][M_TIME])[4..24] + ")\n");
90 }
91 return desc;
92}
93
94varargs string long(int mode)
95{
96 return QueryLong();
97}
98
99mixed *message;
100
101int schreib(string str)
102{
103 int err;
104
105 if (!this_interactive() || !this_interactive()->query_real_name()) return 0;
106 if (writer)
107 {
108 write("Das geht im Moment nicht, da "+capitalize(writer)+" gerade an diesem Brett schreibt.\n");
109 if (usemsg) write(usemsg+"\n");
110 return 1;
111 }
112 _notify_fail("Du musst einen Titel fuer die Notiz angeben !\n");
113 if (!str) return 0;
114 switch (err=NEWSSERVER->AskAllowedWrite(GROUP))
115 {
116 case 1: break;
117 case -1: write("Du darfst keine Notes an dieses Brett heften !\n"); return 1;
118 case -3: write("Das Brett ist leider voll !\n"); return 1;
119 default: write("Interner Fehler "+err+", Erzmagier verstaendigen !\n"); return 1;
120 }
121 writer=this_interactive()->query_real_name();
122 message=allocate(6);
123 message[M_BOARD]=GROUP;
124 message[M_TITLE]=str;
125 message[M_MESSAGE]="";
126 write("Ok, beende Deine Notiz mit '**' oder brich sie mit '~q' ab !\n");
127 if (IS_WIZARD(this_player()))
128 write("Als Magier"+(this_player()->QueryProp(P_GENDER)==FEMALE ? "in" : "")+
129 " kannst Du per '~r<filename>' ein File in die Notiz einlesen.\n");
130 input_to("get_note_line", INPUT_PROMPT, ":");
131 return 1;
132}
133
134int get_note_line(string str)
135{
136 int err;
137 if (str=="**" || str=="~.")
138 {
139 writer=0;
140 switch (err=(NEWSSERVER->WriteNote(message)))
141 {
142 case 1: write("Ok, Nachricht aufgehaengt.\n");
143 say(message[M_WRITER]+" hat eine Nachricht ans Brett gehaengt.\n");
144 return 1;
145 case -1: write("Du darfst leider keine Nachrichten hier aufhaengen.\n");
146 return 1;
147 case -3: write("Das Brett ist leider voll !\n");
148 return 1;
149 default: write("Interner Fehler "+err+" aufgetreten ! Bitte Erzmagier verstaendigen.\n");
150 return 1;
151 }
152 }
153 if (str=="~q")
154 {
155 writer=0;
156 write("Notiz nicht angeheftet.\n");
157 return 1;
158 }
159 if (str[0..1]=="~r" && IS_WIZARD(this_player())) {
160 str=str[2..<1];
161 if (str[0]==' ') str=str[1..<1];
162 if (!str || catch(err=file_size(str);publish) || err<0) {
163 write("File nicht gefunden.\n");
164 input_to("get_note_line", INPUT_PROMPT, ":");
165 return 1;
166 }
167 str=read_file(str);
168 if (!str){
169 write("Zu gross!\n");
170 input_to("get_note_line", INPUT_PROMPT, ":");
171 return 1;
172 }
173 write("Ok.\n");
174 }
175 if (message[M_MESSAGE] && message[M_MESSAGE]!="") message[M_MESSAGE]+="\n";
176 message[M_MESSAGE]+=str;
177 input_to("get_note_line", INPUT_PROMPT, ":");
178 return 1;
179}
180
181int lies(string str)
182{
183 int num;
184 mixed *messages;
185
186 if (!str || str=="" || sscanf(str,"%d",num)!=1 || num<=0)
187 {
188 _notify_fail("WELCHE Nachricht willst Du lesen ?\n");
189 return 0;
190 }
191 num--;
192 messages=(NEWSSERVER->GetNotes(GROUP));
193 if (sizeof(messages)<=num)
194 {
195 _notify_fail("So viele Nachrichten sind da nicht !\n");
196 return 0;
197 }
198 this_player()->More(messages[num][M_TITLE]+" ("+messages[num][M_WRITER]+", "+
199 dtime(messages[num][M_TIME])[5..26] + "):\n" +
200 messages[num][M_MESSAGE]);
201 return 1;
202}
203
204int loesche(string str)
205{
206 int num;
207
208 if (!str || str=="" || sscanf(str,"%d",num)!=1 || num<=0)
209 {
210 _notify_fail("WELCHE Nachricht willst Du loeschen ?\n");
211 return 0;
212 }
213 num--;
214 switch (NEWSSERVER->RemoveNote(GROUP, num)){
215 case 1: write("Ok.\n");
216 say(this_player()->name()+" entfernt eine Nachricht vom Brett.\n");
217 return 1;
218 case -1: write("Das darfst Du nicht.\n");
219 say(this_player()->name()+" versucht, eine Nachricht vom Brett zu reissen.\n");
220 return 1;
221 case -3: write("So viele Nachrichten sind da nicht !\n");
222 return 1;
223 default: write("Interner Fehler. Bitte Erzmagier verstaendigen !\n");
224 return 1;
225 }
MG Mud User88f12472016-06-24 23:31:02 +0200226}
227
228void Crumble()
229{
230 if (environment() && living(environment()))
231 return;
232 say(capitalize(name(WER))+" zerfaellt zu Staub, der sich sofort verteilt.\n");
233 write(capitalize(name(WER))+" zerfaellt zu Staub, der sich sofort verteilt.\n");
234 remove();
235}
236
237varargs int move(object target,mixed method)
238{
239 if (objectp(target)&&!living(target)&&environment()&&living(environment()))
240 call_out("Crumble",30+random(30));
241 return ::move(target, method);
242}