1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
#ifndef __ACCOUNT_H_INCLUDED__
#define __ACCOUNT_H_INCLUDED__
#include "../common/cbasetypes.h"
#include "../common/mmo.h" // ACCOUNT_REG2_NUM
typedef struct AccountDB AccountDB;
typedef struct AccountDBIterator AccountDBIterator;
// standard engines
AccountDB* account_db_sql(void);
// extra engines (will probably use the other txt functions)
#define ACCOUNTDB_CONSTRUCTOR_(engine) account_db_##engine
#define ACCOUNTDB_CONSTRUCTOR(engine) ACCOUNTDB_CONSTRUCTOR_(engine)
#ifdef ACCOUNTDB_ENGINE_0
AccountDB* ACCOUNTDB_CONSTRUCTOR(ACCOUNTDB_ENGINE_0)(void);
#endif
#ifdef ACCOUNTDB_ENGINE_1
AccountDB* ACCOUNTDB_CONSTRUCTOR(ACCOUNTDB_ENGINE_1)(void);
#endif
#ifdef ACCOUNTDB_ENGINE_2
AccountDB* ACCOUNTDB_CONSTRUCTOR(ACCOUNTDB_ENGINE_2)(void);
#endif
#ifdef ACCOUNTDB_ENGINE_3
AccountDB* ACCOUNTDB_CONSTRUCTOR(ACCOUNTDB_ENGINE_3)(void);
#endif
#ifdef ACCOUNTDB_ENGINE_4
AccountDB* ACCOUNTDB_CONSTRUCTOR(ACCOUNTDB_ENGINE_4)(void);
#endif
struct mmo_account
{
int account_id;
char userid[NAME_LENGTH];
char pass[32+1]; // 23+1 for plaintext, 32+1 for md5-ed passwords
char sex; // gender (M/F/S)
char email[40]; // e-mail (by default: a@a.com)
int group_id; // player group id
uint8 char_slots; // this accounts maximum character slots (maximum is limited to MAX_CHARS define in char server)
unsigned int state; // packet 0x006a value + 1 (0: compte OK)
time_t unban_time; // (timestamp): ban time limit of the account (0 = no ban)
time_t expiration_time; // (timestamp): validity limit of the account (0 = unlimited)
unsigned int logincount; // number of successful auth attempts
unsigned int pincode_change;// (timestamp): last time of pincode change
char pincode[4+1]; // pincode value
char lastlogin[24]; // date+time of last successful login
char last_ip[16]; // save of last IP of connection
char birthdate[10+1]; // assigned birth date (format: YYYY-MM-DD, default: 0000-00-00)
int account_reg2_num;
struct global_reg account_reg2[ACCOUNT_REG2_NUM]; // account script variables (stored on login server)
};
struct AccountDBIterator
{
/// Destroys this iterator, releasing all allocated memory (including itself).
///
/// @param self Iterator
void (*destroy)(AccountDBIterator* self);
/// Fetches the next account in the database.
/// Fills acc with the account data.
/// @param self Iterator
/// @param acc Account data
/// @return true if successful
bool (*next)(AccountDBIterator* self, struct mmo_account* acc);
};
struct AccountDB
{
/// Initializes this database, making it ready for use.
/// Call this after setting the properties.
///
/// @param self Database
/// @return true if successful
bool (*init)(AccountDB* self);
/// Destroys this database, releasing all allocated memory (including itself).
///
/// @param self Database
void (*destroy)(AccountDB* self);
/// Gets a property from this database.
/// These read-only properties must be implemented:
/// "engine.name" -> "txt", "sql", ...
/// "engine.version" -> internal version
/// "engine.comment" -> anything (suggestion: description or specs of the engine)
///
/// @param self Database
/// @param key Property name
/// @param buf Buffer for the value
/// @param buflen Buffer length
/// @return true if successful
bool (*get_property)(AccountDB* self, const char* key, char* buf, size_t buflen);
/// Sets a property in this database.
///
/// @param self Database
/// @param key Property name
/// @param value Property value
/// @return true if successful
bool (*set_property)(AccountDB* self, const char* key, const char* value);
/// Creates a new account in this database.
/// If acc->account_id is not -1, the provided value will be used.
/// Otherwise the account_id will be auto-generated and written to acc->account_id.
///
/// @param self Database
/// @param acc Account data
/// @return true if successful
bool (*create)(AccountDB* self, struct mmo_account* acc);
/// Removes an account from this database.
///
/// @param self Database
/// @param account_id Account id
/// @return true if successful
bool (*remove)(AccountDB* self, const int account_id);
/// Modifies the data of an existing account.
/// Uses acc->account_id to identify the account.
///
/// @param self Database
/// @param acc Account data
/// @return true if successful
bool (*save)(AccountDB* self, const struct mmo_account* acc);
/// Finds an account with account_id and copies it to acc.
///
/// @param self Database
/// @param acc Pointer that receives the account data
/// @param account_id Target account id
/// @return true if successful
bool (*load_num)(AccountDB* self, struct mmo_account* acc, const int account_id);
/// Finds an account with userid and copies it to acc.
///
/// @param self Database
/// @param acc Pointer that receives the account data
/// @param userid Target username
/// @return true if successful
bool (*load_str)(AccountDB* self, struct mmo_account* acc, const char* userid);
/// Returns a new forward iterator.
///
/// @param self Database
/// @return Iterator
AccountDBIterator* (*iterator)(AccountDB* self);
};
void account_db_sql_up(AccountDB* self);
#endif // __ACCOUNT_H_INCLUDED__
|