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
|
// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// See the LICENSE file
// Portions Copyright (c) Athena Dev Teams
#ifndef LOGIN_ACCOUNT_H
#define LOGIN_ACCOUNT_H
#include "../common/cbasetypes.h"
#include "../common/mmo.h" // ACCOUNT_REG2_NUM
#include "../common/sql.h" // Sql
typedef struct AccountDB AccountDB;
typedef struct AccountDBIterator AccountDBIterator;
#ifdef HERCULES_CORE
// standard engines
AccountDB* account_db_sql(void);
#endif // HERCULES_CORE
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: complete 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)
};
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 Account_engine {
AccountDB* (*constructor)(void);
AccountDB* db;
};
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);
};
#ifdef HERCULES_CORE
Sql *account_db_sql_up(AccountDB* self);
void mmo_send_accreg2(AccountDB* self, int fd, int account_id, int char_id);
void mmo_save_accreg2(AccountDB* self, int fd, int account_id, int char_id);
#endif // HERCULES_CORE
#endif /* LOGIN_ACCOUNT_H */
|