blob: 2b757e4ad7b705073ca4224975e73cbaceaafbf1 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2/** \file /file.c
3* Kurzbeschreibung.
4* Langbeschreibung...
5* \author <Autor>
6* \date <date>
7* \version $Id$
8*/
9/* Changelog:
10*/
11#pragma strong_types,save_types,rtt_checks
12#pragma no_clone,no_inherit,no_shadow
13#pragma pedantic, range_check
14
15#include <defines.h>
16#include <events.h>
17#include <wizlevels.h>
18#include <lepmaster.h>
19#include <properties.h>
20#include <userinfo.h>
21
22#define HOME(x) (__PATH__(0)+x)
23#include <living/comm.h>
24#define ZDEBUG(x) if (find_player("zesstra")) \
25 find_player("zesstra")->ReceiveMsg(x,MT_DEBUG,0,object_name()+":",this_object())
26//#define ZDEBUG(x)
27
28object *players = ({});
29
30protected void create()
31{
32 seteuid(getuid());
33 if (sl_open(HOME("ARCH/topliste.sqlite")) != 1)
34 {
35 raise_error("Datenbank konnte nicht geoeffnet werden.\n");
36 }
37 // Tabellen und Indices anlegen, falls die nicht existieren.
38 sl_exec("CREATE TABLE IF NOT EXISTS topliste(name TEXT PRIMARY KEY ASC, "
39 "gilde TEXT NOT NULL, rasse TEXT NOT NULL, "
40 "age DATETIME, wizlevel INTEGER, "
41 "lastupdate DATETIME DEFAULT current_timestamp, "
42 "lep INTEGER, qp INTEGER, xp INTEGER, level INTEGER"
43 "hardcore INTEGER);");
44 sl_exec("CREATE INDEX IF NOT EXISTS idx_gilde ON topliste(gilde);");
45 sl_exec("CREATE INDEX IF NOT EXISTS idx_rasse ON topliste(rasse);");
46 sl_exec("CREATE INDEX IF NOT EXISTS idx_hardcore ON topliste(hardcore);");
47
48 // Login-Event abonnieren
49 if (EVENTD->RegisterEvent(EVT_LIB_LOGIN,
50 "listen", this_object()) <= 0)
51 {
52 raise_error("Loginevent konnte nicht abonniert werden.\n");
53 }
54 if (EVENTD->RegisterEvent(EVT_LIB_ADVANCE,
55 "listen", this_object()) <= 0)
56 {
57 raise_error("EVT_LIB_ADVANCE konnte nicht abonniert werden.\n");
58 }
59 if (EVENTD->RegisterEvent(EVT_LIB_QUEST_SOLVED,
60 "listen", this_object()) <= 0)
61 {
62 raise_error("EVT_LIB_QUEST_SOLVED konnte nicht abonniert werden.\n");
63 }
64 if (EVENTD->RegisterEvent(EVT_LIB_MINIQUEST_SOLVED,
65 "listen", this_object()) <= 0)
66 {
67 raise_error("EVT_LIB_MINIQUEST_SOLVED konnte nicht abonniert werden.\n");
68 }
69}
70
71private void process()
72{
73 foreach(object pl : &players)
74 {
75 if (get_eval_cost() < 200000)
76 {
77 call_out(#'process, 2);
78 players -= ({0});
79 return;
80 }
81 sl_exec("INSERT OR REPLACE INTO topliste(name, gilde, rasse, "
82 "age, wizlevel, lastupdate, lep, qp, xp, level, hardcore) "
83 "VALUES(?1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11);",
84 pl->query_real_name(),
85 pl->QueryProp(P_GUILD) || "unbekannt",
86 pl->QueryProp(P_RACE),
87 pl->QueryProp(P_AGE),
88 query_wiz_level(pl),
89 time(),
90 LEPMASTER->QueryLEPForPlayer(pl),
91 pl->QueryProp(P_QP),
92 pl->QueryProp(P_XP),
93 pl->QueryProp(P_LEVEL),
94 pl->query_hc_play()
95 );
96 pl=0;
97 }
98 players -= ({0});
99}
100
101public void listen(string eid, object trigob, mixed data)
102{
103 if (previous_object() != find_object(EVENTD)
104 || !trigob
105 || !query_once_interactive(trigob)
106 || IS_LEARNER(trigob)
107 || (mixed)trigob->QueryProp(P_TESTPLAYER)
108 || trigob->QueryGuest()
109 || trigob->QueryProp(P_NO_TOPLIST)
110 )
111 return;
112
113 // Dieser handler hat nur 30k Ticks zur Verfuegung, dummerweise kann
114 // QueryLEPForPlayer() locker ueber 30k kosten, wenn der Spieler nicht in
115 // Caches drin ist. Daher muss das jetzt per call_out entkoppelt werden.
116 // *seufz*
117 if (member(players, trigob) == -1)
118 {
119 players += ({trigob});
120 if (find_call_out(#'process) == -1)
121 call_out(#'process, 2);
122 }
123}
124
125public varargs < <string|int>* >* Liste(string rasse, string gilde,
126 int limit, string sort)
127{
128 // Defaults:
129 sort ||= "lep";
130 if (!limit || limit > 100)
131 limit=100;
132 else if (limit < 1)
133 limit=1;
134 if (rasse && gilde)
135 return sl_exec(
136 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
137 "WHERE rasse=?1 AND gilde=?2 "
138 "ORDER BY "+sort+" DESC LIMIT "+limit+";",
139 rasse, gilde);
140 else if (rasse)
141 return sl_exec(
142 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
143 "WHERE rasse=?1 "
144 "ORDER BY "+sort+" DESC LIMIT "+limit+";",
145 rasse);
146 else if (gilde)
147 return sl_exec(
148 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
149 "WHERE gilde=?1 "
150 "ORDER BY "+sort+" DESC LIMIT "+limit+";",
151 gilde);
152 return sl_exec(
153 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
154 "ORDER BY "+sort+" DESC LIMIT "+limit+";");
155}
156
157public varargs < <string|int>* >* SpielerListe(string rasse, string gilde,
158 int limit, string sort)
159{
160 // Defaults:
161 sort ||= "lep";
162 if (!limit || limit > 100)
163 limit=100;
164 else if (limit < 1)
165 limit=1;
166 if (rasse && gilde)
167 return sl_exec(
168 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
169 "WHERE rasse=?1 AND gilde=?2 AND wizlevel=0 "
170 "ORDER BY "+sort+" DESC LIMIT "+limit+";",
171 rasse, gilde);
172 else if (rasse)
173 return sl_exec(
174 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
175 "WHERE rasse=?1 AND wizlevel=0 "
176 "ORDER BY "+sort+" DESC LIMIT "+limit+";",
177 rasse);
178 else if (gilde)
179 return sl_exec(
180 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
181 "WHERE gilde=?1 AND wizlevel=0 "
182 "ORDER BY "+sort+" DESC LIMIT "+limit+";",
183 gilde);
184 return sl_exec(
185 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
186 "WHERE wizlevel=0 "
187 "ORDER BY "+sort+" DESC LIMIT "+limit+";");
188}
189
190public varargs < <string|int>* >* SeherListe(string rasse, string gilde,
191 int limit, string sort)
192{
193 // Defaults:
194 sort ||= "lep";
195 if (!limit || limit > 100)
196 limit=100;
197 else if (limit < 1)
198 limit=1;
199 if (rasse && gilde)
200 return sl_exec(
201 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
202 "WHERE rasse=?1 AND gilde=?2 AND wizlevel=1 "
203 "ORDER BY "+sort+" DESC LIMIT "+limit+";",
204 rasse, gilde);
205 else if (rasse)
206 return sl_exec(
207 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
208 "WHERE rasse=?1 AND wizlevel=1 "
209 "ORDER BY "+sort+" DESC LIMIT "+limit+";",
210 rasse);
211 else if (gilde)
212 return sl_exec(
213 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
214 "WHERE gilde=?1 AND wizlevel=1 "
215 "ORDER BY "+sort+" DESC LIMIT "+limit+";",
216 gilde);
217 return sl_exec(
218 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
219 "WHERE wizlevel=1 "
220 "ORDER BY "+sort+" DESC LIMIT "+limit+";");
221}
222
223public varargs < <string|int>* >* HardcoreListe(string rasse, string gilde,
224 int limit, string sort)
225{
226 // Defaults:
227 sort ||= "lep";
228 if (!limit || limit > 100)
229 limit=100;
230 else if (limit < 1)
231 limit=1;
232 if (rasse && gilde)
233 return sl_exec(
234 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
235 "WHERE rasse=?1 AND gilde=?2 AND hardcore>0 "
236 "ORDER BY "+sort+" DESC LIMIT "+limit+";",
237 rasse, gilde);
238 else if (rasse)
239 return sl_exec(
240 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
241 "WHERE rasse=?1 AND hardcore>0 "
242 "ORDER BY "+sort+" DESC LIMIT "+limit+";",
243 rasse);
244 else if (gilde)
245 return sl_exec(
246 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
247 "WHERE gilde=?1 AND hardcore>0 "
248 "ORDER BY "+sort+" DESC LIMIT "+limit+";",
249 gilde);
250 return sl_exec(
251 "select name,lep,qp,xp,level,age,rasse,gilde,wizlevel,hardcore from topliste "
252 "WHERE hardcore>0 "
253 "ORDER BY "+sort+" DESC LIMIT "+limit+";");
254}
255
256varargs int remove(int silent)
257{
258 EVENTD->UnregisterEvent(EVT_LIB_LOGIN, this_object());
259 sl_close();
260 destruct(ME);
261 return 1;
262}
263
264public mixed sql_query(string query)
265{
266 if (ARCH_SECURITY)
267 return sl_exec(query);
268 return 0;
269}
270
271void reset()
272{
273 // Alle Eintraege loeschen, die seit 90 nicht mehr aktualisiert wurden.
274// sl_exec("DELETE FROM topliste WHERE lastupdate<?1;",
275// time()-90*24*3600);
276 sl_exec("DELETE FROM topliste WHERE name IN (SELECT name FROM topliste "
277 "ORDER BY lep DESC LIMIT 1000, -1);");
278 set_next_reset(86400);
279}
280