blob: 899fe1ee5b92612df4ebf32e6bf9cf637817d6ef [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// da dieses Objekt in /secure liegt und ROOTID inne hat, muessen besondere
2// Sicherheitsvorkehrungen getroffen werden. Insbesondere duerfen keine Files
3// aus /std/ inheritet werden, da es fuer diese Files keiner ROOTID bedarf.
4
5#include <properties.h>
6#include <defines.h>
7#include "/secure/wizlevels.h"
8
9static string in_use;
10
11string thema;
12string *moeglichkeiten;
13string *ergebnis;
14
15#undef SAY
16
17private void SAY( string str )
18{
19 write ( str );
20 write_file("/log/WAHL", str);
21}
22
23void create()
24{
25 if (clonep(ME)) destruct(ME);
26 if (ergebnis) return;
27 seteuid(getuid());
28 in_use=0;
29 ergebnis=({({}),({})});
30 moeglichkeiten=({});
31 restore_object("wahl/wahl");
32 move_object(ME, "/gilden/abenteurer");
33}
34
35varargs string name(int casus, int demon)
36{
37 if (demon==RAW) return "Wahlmaschine";
38 switch(casus) {
39 case WEM:
40 case WESSEN:
41 if (demon==1)
42 return "der Wahlmaschine";
43 return "einer Wahlmaschine";
44 default:
45 if (demon==1)
46 return "die Wahlmaschine";
47 return "eine Wahlmaschine";
48 }
49}
50
51varargs string Name(int casus, int demon)
52{ return capitalize(name(casus, demon)); }
53
54
55public string QueryPronoun(int casus)
56{
57 switch(casus)
58 {
59 case WER:
60 return "sie";
61 break;
62 case WEM:
63 return "ihr";
64 }
65 return "sie";
66}
67
68string short()
69{ return "Eine Wahlmaschine.\n"; }
70
71string long()
72{
73 return "Eine Wahlmaschine. Mit ihr koennen geheime Wahlen durchgefuehrt werden.\n"+
74 "Aktuelles Thema: "+(stringp(thema) ? thema : "keines")+"\n";
75}
76
77mixed Query(mixed param)
78{
79 if (!stringp(param)) return 0;
80 switch (param) {
81 case P_NOGET: return 1;
82 case P_GENDER: return FEMALE;
83 case P_NAME: return "Wahlmaschine";
84 }
85 return 0;
86}
87
88mixed QueryProp(mixed param)
89{ return Query(param); }
90
91int Set(mixed param)
92{ return -1; }
93
94int SetProp(mixed param)
95{ return -1; }
96
97varargs int id(string str, int lvl)
98{ return (member(({"maschine", "waehler", "wahlmaschine"}), str)!=-1); }
99
100// ab hier kommt der eigentliche Code der Wahlmaschine
101
102void init()
103{
104 add_action("waehle", "waehl",1);
105 add_action("auswertung","auswertung");
106 add_action("wahlthema", "wahlthema");
107 add_action("moeglichkeit","moeglichkeit");
108}
109
110void save_me()
111{ save_object("wahl/wahl"); }
112
113static int waehle()
114{
115 int i;
116 mixed second;
117
118 if (!RPL) return 0;
119 if (RPL->QueryProp(P_LEVEL)<10) {
120 notify_fail("Man kann erst ab Stufe 10 mitwaehlen :(\n");
121 return 0;
122 }
123 if (RPL->QueryProp(P_TESTPLAYER)) {
124 notify_fail("Testspieler sind von der Wahl ausgeschlossen.\n");
125 return 0;
126 }
127 if ((second=RPL->QueryProp(P_SECOND)) &&
Zesstra85576452017-01-30 15:43:21 +0100128 (!stringp(second)
129 || !master()->find_userinfo(second)))
130 {
MG Mud User88f12472016-06-24 23:31:02 +0200131 notify_fail("Nicht richtig markierte Zweities sind von der Wahl ausgeschlossen.\n");
132 return 0;
133 }
134 if (in_use)
135 {
136 write(in_use+" waehlt gerade, warte also bitte einen Augenblick.\n");
137 return 1;
138 }
139 in_use=capitalize(getuid(RPL));
140 say(in_use+" tritt an die Wahlmaschine.\n");
141 write(long());
142 write("Das steht zur Auswahl:\n");
143 for (i=0;i<sizeof(moeglichkeiten);i++)
144 write(sprintf(" -- %d.) %s\n",i+1,moeglichkeiten[i]));
145 write("Triff nun Deine Wahl (sie ist UNSICHTBAR): ");
146 input_to("waehle_2",1);
147 return 1;
148}
149
150private int falsch()
151{
152 write("Diese Auswahl ist ungueltig. Versuchs bitte gleich nochmal.\n");
153 say(in_use+" hat ausgewaehlt.\n");
154 in_use=0;
155 return 1;
156}
157
158static int waehle_2(string str)
159{
160 int i;
161 mixed name;
162
163 if (!str) return falsch();
164
165 name=RPL->QueryProp(P_SECOND);
166 if (!stringp(name))
167 name=getuid(RPL);
168 else name=lower_case(name);
169
170 if (member_array(str, moeglichkeiten)==-1) {
171 if ( !sscanf( str, "%d", i ) ) return falsch();
172 if ( i<1 || i>sizeof(moeglichkeiten) ) return falsch();
173 ergebnis=insert_alist(name,moeglichkeiten[i-1],ergebnis);
174 }
175 else ergebnis=insert_alist(name,str,ergebnis);
176 write("Ok.\n");
177 save_me();
178 say(in_use+" hat ausgewaehlt.\n");
179 in_use=0;
180 return 1;
181}
182
183static int auswertung()
184{
185 int i,j,max,all;
186 mapping stimmen, data;
187 mixed names;
188
189 if (!ARCH_SECURITY || process_call()) return 0;
190
191 rm("/log/WAHL");
192
193 data = mkmapping(ergebnis[0], ergebnis[1]);
194 names = m_indices(data);
195 stimmen = ([]);
196
197 SAY("\n\n\nWahlergebnisse zum Thema: "+thema+"\n");
198 SAY("\nGewaehlt haben folgende Personen: \n");
199 SAY(break_string(CountUp(map(sort_array(names, #'>/*'*/), #'capitalize/*'*/)), 78));
200 SAY("\n");
201
202 while(sizeof(names)) {
203 stimmen[data[names[0]]]++;
204 names[0..0] = ({});
205 all++;
206 }
207
208 SAY("*****************************************\n");
209 SAY("Ergebnis:\n");
210 for (i=0;i<sizeof(moeglichkeiten);i++)
211 SAY(sprintf(" -- %2d.) %20s: %3d (%' '3.2f%%)\n", i+1, moeglichkeiten[i],
212 stimmen[moeglichkeiten[i]], 1.0 * stimmen[moeglichkeiten[i]] * 100.0 / (1.0 * all)));
213 SAY(sprintf("Gesamtstimmen: %d\n", sizeof(m_indices(data))));
214 return 1;
215}
216
217static int wahlthema(string str)
218{
219 if (!ARCH_SECURITY || process_call()) {
220 write("NOT allowed");
221 return 0;
222 }
223 if (!(str=this_interactive()->_unparsed_args())) return 0;
224 thema=str;
225 say(RPL->name(WER)+" setzt ein neues Abstimmungsthema fest.\n");
226 ergebnis=({({}),({})});
227 moeglichkeiten=({});
228 write("Ok.\n");
229 save_me();
230 return 1;
231}
232
233static int moeglichkeit(string str)
234{
235 if (!ARCH_SECURITY || process_call()) {
236 write("NOT allowed");
237 return 0;
238 }
239 if (!(str=RPL->_unparsed_args())) return 0;
240 if (member_array(str, moeglichkeiten) != -1) {
241 write("Schon drin.\n");
242 return 1;
243 }
244 moeglichkeiten+=({str});
245 write("Ok.\n");
246 save_me();
247 return 1;
248}
249
250mixed _internal()
251{
252 if (!ARCH_SECURITY || process_call()) return 0;
253 return ergebnis;
254}