/[LeafOK_CVS]/lbbs/utils/game/money.c
ViewVC logotype

Annotation of /lbbs/utils/game/money.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (hide annotations)
Tue May 6 05:12:29 2025 UTC (10 months, 1 week ago) by sysadm
Branch: MAIN
Changes since 1.2: +218 -11 lines
Content type: text/x-csrc
Refact chicken and money
Add database save/load for money

1 sysadm 1.3 #include "money.h"
2     #include "database.h"
3     #include "log.h"
4     #include "user_priv.h"
5     #include <stdio.h>
6     #include <mysql.h>
7 sysadm 1.1
8 sysadm 1.3 int BBS_user_money = 0;
9    
10     int money_balance()
11     {
12     return BBS_user_money;
13     }
14    
15     int money_deposit(int money)
16 sysadm 1.2 {
17 sysadm 1.3 MYSQL *db;
18     MYSQL_RES *rs;
19     MYSQL_ROW row;
20     char sql[SQL_BUFFER_LEN];
21     int ret = 0;
22    
23     if (money <= 0)
24     {
25     return 0;
26     }
27    
28     db = db_open();
29     if (db == NULL)
30     {
31     return -1;
32     }
33    
34     // Begin transaction
35     if (mysql_query(db, "SET autocommit=0") != 0)
36     {
37     log_error("SET autocommit=0 failed\n");
38     return -1;
39     }
40    
41     if (mysql_query(db, "BEGIN") != 0)
42     {
43     log_error("Begin transaction failed\n");
44     return -1;
45     }
46    
47     snprintf(sql, sizeof(sql),
48     "SELECT game_money FROM user_pubinfo WHERE UID = %ld FOR UPDATE",
49     BBS_priv.uid);
50    
51     if (mysql_query(db, sql) != 0)
52     {
53     log_error("Query user_pubinfo failed\n");
54     return -1;
55     }
56     if ((rs = mysql_store_result(db)) == NULL)
57     {
58     log_error("Get user money failed\n");
59     return -1;
60     }
61     if ((row = mysql_fetch_row(rs)))
62     {
63     BBS_user_money = atoi(row[0]);
64     }
65     mysql_free_result(rs);
66    
67     if (BBS_user_money + money < USER_MONEY_MAX)
68     {
69     ret = money;
70 sysadm 1.2 BBS_user_money += money;
71 sysadm 1.3 }
72     else if (BBS_user_money < USER_MONEY_MAX)
73     {
74     ret = USER_MONEY_MAX - BBS_user_money;
75     BBS_user_money = USER_MONEY_MAX;
76     }
77     else // Balance exceeds 1 billion !!!
78     {
79     mysql_close(db);
80     return -2;
81     }
82    
83     snprintf(sql, sizeof(sql),
84     "UPDATE user_pubinfo SET game_money = %d WHERE UID = %ld",
85     BBS_user_money, BBS_priv.uid);
86    
87     if (mysql_query(db, sql) != 0)
88     {
89     log_error("Update user_pubinfo failed\n");
90     return -1;
91     }
92    
93     // Commit transaction
94     if (mysql_query(db, "COMMIT") != 0)
95     {
96     log_error("Commit transaction failed\n");
97     return -1;
98     }
99    
100     mysql_close(db);
101    
102     return ret;
103 sysadm 1.1 }
104    
105 sysadm 1.3 int money_withdraw(int money)
106 sysadm 1.2 {
107 sysadm 1.3 MYSQL *db;
108     MYSQL_RES *rs;
109     MYSQL_ROW row;
110     char sql[SQL_BUFFER_LEN];
111     int ret = 0;
112    
113     if (money <= 0)
114     {
115     return 0;
116     }
117    
118     db = db_open();
119     if (db == NULL)
120     {
121     return -1;
122     }
123    
124     // Begin transaction
125     if (mysql_query(db, "SET autocommit=0") != 0)
126     {
127     log_error("SET autocommit=0 failed\n");
128     return -1;
129     }
130    
131     if (mysql_query(db, "BEGIN") != 0)
132     {
133     log_error("Begin transaction failed\n");
134     return -1;
135     }
136    
137     snprintf(sql, sizeof(sql),
138     "SELECT game_money FROM user_pubinfo WHERE UID = %ld FOR UPDATE",
139     BBS_priv.uid);
140    
141     if (mysql_query(db, sql) != 0)
142     {
143     log_error("Query user_pubinfo failed\n");
144     return -1;
145     }
146     if ((rs = mysql_store_result(db)) == NULL)
147     {
148     log_error("Get user money failed\n");
149     return -1;
150     }
151     if ((row = mysql_fetch_row(rs)))
152     {
153     BBS_user_money = atoi(row[0]);
154     }
155     mysql_free_result(rs);
156    
157     if (BBS_user_money >= money)
158     {
159     ret = money;
160 sysadm 1.2 BBS_user_money -= money;
161 sysadm 1.3 }
162     else // No enough balance
163     {
164     mysql_close(db);
165     return -2;
166     }
167    
168     snprintf(sql, sizeof(sql),
169     "UPDATE user_pubinfo SET game_money = %d WHERE UID = %ld",
170     BBS_user_money, BBS_priv.uid);
171    
172     if (mysql_query(db, sql) != 0)
173     {
174     log_error("Update user_pubinfo failed\n");
175     return -1;
176     }
177    
178     // Commit transaction
179     if (mysql_query(db, "COMMIT") != 0)
180     {
181     log_error("Commit transaction failed\n");
182     return -1;
183     }
184    
185     mysql_close(db);
186    
187     return ret;
188     }
189    
190     int money_refresh(void)
191     {
192     MYSQL *db;
193     MYSQL_RES *rs;
194     MYSQL_ROW row;
195     char sql[SQL_BUFFER_LEN];
196    
197     db = db_open();
198     if (db == NULL)
199     {
200     return -1;
201     }
202    
203     snprintf(sql, sizeof(sql),
204     "SELECT game_money FROM user_pubinfo WHERE UID = %ld FOR UPDATE",
205     BBS_priv.uid);
206    
207     if (mysql_query(db, sql) != 0)
208     {
209     log_error("Query user_pubinfo failed\n");
210     return -1;
211     }
212     if ((rs = mysql_store_result(db)) == NULL)
213     {
214     log_error("Get user money failed\n");
215     return -1;
216     }
217     if ((row = mysql_fetch_row(rs)))
218     {
219     BBS_user_money = atoi(row[0]);
220     }
221     mysql_free_result(rs);
222    
223     mysql_close(db);
224    
225     return 0;
226 sysadm 1.1 }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1