blob: 6a69bdc884ffd459f5403e7a7cd42f3528226482 [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 <player/base.h>
19#include <userinfo.h>
Zesstra3c093512019-01-07 22:55:26 +010020#include <config.h>
MG Mud User88f12472016-06-24 23:31:02 +020021
Zesstra3c093512019-01-07 22:55:26 +010022#define DBPATH "/"LIBDATADIR"/"SECUREDIR"/ARCH/second.sqlite"
23
MG Mud User88f12472016-06-24 23:31:02 +020024#define ZDEBUG(x) tell_room("/players/zesstra/workroom",\
25 sprintf("second: %O\n",x));
26
27protected void create()
28{
29 seteuid(getuid());
Zesstra3c093512019-01-07 22:55:26 +010030 if (sl_open(DBPATH) != 1)
MG Mud User88f12472016-06-24 23:31:02 +020031 {
32 raise_error("Datenbank konnte nicht geoeffnet werden.\n");
33 }
34 // Tabellen und Indices anlegen, falls die nicht existieren.
35 sl_exec("CREATE TABLE IF NOT EXISTS zweities(uuid TEXT PRIMARY KEY ASC, "
36 "name TEXT NOT NULL, erstieuuid TEXT NOT NULL, "
37 "erstie TEXT NOT NULL);");
38 sl_exec("CREATE TABLE IF NOT EXISTS testies(name TEXT PRIMARY KEY ASC, "
39 "magier TEXT NOT NULL, "
40 "lastlogin DATETIME DEFAULT current_timestamp);");
41 sl_exec("CREATE TABLE IF NOT EXISTS familien("
42 "erstieuuid TEXT PRIMARY KEY ASC, familie TEXT NOT NULL);");
43 sl_exec("CREATE INDEX IF NOT EXISTS idx_erstie ON zweities(erstie);");
44 sl_exec("CREATE INDEX IF NOT EXISTS idx_name ON zweities(name);");
45 sl_exec("CREATE INDEX IF NOT EXISTS idx_magiername ON testies(magier);");
46 sl_exec("CREATE INDEX IF NOT EXISTS idx_familie ON familien(familie);");
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}
55
56public void listen(string eid, object trigob, mixed data)
57{
58 if (previous_object() != find_object(EVENTD)
59 || !trigob
60 || !query_once_interactive(trigob)
61 || IS_LEARNER(trigob))
62 return;
63 // wenn testie, wird der Char als Testie behandelt und P_SECOND ignoriert.
64 mixed testie=trigob->QueryProp(P_TESTPLAYER);
65 if (stringp(testie)
66 && strstr(testie,"Gilde")==-1)
67 {
Zesstra3c093512019-01-07 22:55:26 +010068 mixed plinfo = master()->get_userinfo(lower_case(testie));
MG Mud User88f12472016-06-24 23:31:02 +020069 if (pointerp(plinfo))
70 {
71 sl_exec("INSERT OR REPLACE INTO testies(name, magier, lastlogin) "
72 "VALUES(?1,?2,?3);",
73 trigob->query_real_name(),
74 testie, time());
75 return; // zweitie jetzt auf jeden Fall ignorieren.
76 }
77 }
78
79 mixed erstie=trigob->QueryProp(P_SECOND);
80 if (stringp(erstie))
81 {
Zesstra3c093512019-01-07 22:55:26 +010082 mixed plinfo = master()->get_userinfo(lower_case(erstie));
MG Mud User88f12472016-06-24 23:31:02 +020083 if (pointerp(plinfo))
84 {
85 sl_exec("INSERT OR REPLACE INTO zweities(uuid, name, erstieuuid, erstie) "
86 "VALUES(?1,?2,?3,?4);",
87 getuuid(trigob),
88 trigob->query_real_name(),
89 erstie + "_" + plinfo[USER_CREATION_DATE+1],
90 erstie);
91 }
92 //ZDEBUG(sprintf("%O, %O, %O\n",eid,trigob,data));
93 }
94}
95
96varargs int remove(int silent)
97{
98 EVENTD->UnregisterEvent(EVT_LIB_LOGIN, this_object());
99 sl_close();
100 destruct(ME);
101 return 1;
102}
103
104public mixed sql_query(string query)
105{
106 if (ARCH_SECURITY)
107 return sl_exec(query);
108 return 0;
109}
110
111private string get_erstie_data(string datum, object zweitie)
112{
113 if (!zweitie) return 0;
114 mixed res = sl_exec("SELECT " + datum + " FROM zweities WHERE uuid=?1",
115 getuuid(zweitie));
116 if (sizeof(res))
117 return res[0][0];
118
119 return 0;
120}
121
122public varargs string QueryErstieName(object zweitie)
123{
124 return get_erstie_data("erstie", zweitie || previous_object());
125}
126
127public varargs string QueryErstieUUID(object zweitie)
128{
129 return get_erstie_data("erstieuuid", zweitie || previous_object());
130}
131
132private string* get_zweitie_data(string datum, object erstie)
133{
134 if (!erstie) return 0;
135 mixed tmp = sl_exec("SELECT " + datum + " FROM zweities WHERE erstieuuid=?1",
136 getuuid(erstie));
137 if (sizeof(tmp))
138 {
139 string *res=({});
140 foreach(string *row: tmp)
141 res+=({row[0]});
142 return res;
143 }
144 return 0;
145}
146
147public varargs string* QueryZweities(object erstie)
148{
149 return get_zweitie_data("name", erstie || previous_object());
150}
151
152public varargs string QueryFamilie(object pl)
153{
154 string erstie = get_erstie_data("erstieuuid",
155 pl || previous_object());
156 // Wenn !erstie, dann ist pl kein Zweitie, also ist er selber erstie
157 erstie ||= getuuid(pl);
158 // jetzt noch gucken, ob ne explizite Familie fuer den erstie erfasst ist.
159 mixed tmp = sl_exec("SELECT familie FROM familien WHERE "
160 "erstieuuid=?1",erstie);
161 if (sizeof(tmp))
162 return tmp[0][0];
163 // wenn nicht, dann ist die Familie die Zweitieuuid
164 return erstie;
165}
166