account_wrap.c
上传用户:tany51
上传日期:2013-06-12
资源大小:1397k
文件大小:84k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 1998,1999  Ross Combs (rocombs@cs.nmsu.edu)
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  */
  18. #define CHARACTER_INTERNAL_ACCESS
  19. #include "common/setup_before.h"
  20. #include <stdio.h>
  21. #ifdef HAVE_STDDEF_H
  22. # include <stddef.h>
  23. #else
  24. # ifndef NULL
  25. #  define NULL ((void *)0)
  26. # endif
  27. #endif
  28. #ifdef STDC_HEADERS
  29. # include <stdlib.h>
  30. #endif
  31. #ifdef HAVE_STRING_H
  32. # include <string.h>
  33. #else
  34. # ifdef HAVE_STRINGS_H
  35. #  include <strings.h>
  36. # endif
  37. #endif
  38. #include "common/list.h"
  39. #include "common/eventlog.h"
  40. #include "common/util.h"
  41. #include "common/bnettime.h"
  42. #include "ladder.h"
  43. #include "account.h"
  44. #include "character.h"
  45. #include "connection.h"
  46. #include "compat/strcasecmp.h"
  47. #include "compat/strncasecmp.h"
  48. #include "common/setup_after.h"
  49. #include "common/bnet_protocol.h"
  50. #include "common/tag.h"
  51. #include "command.h"
  52. //aaron
  53. #include "prefs.h"
  54. #include "friends.h"
  55. #include "clan.h"
  56. #include "anongame_infos.h"
  57. static unsigned int char_icon_to_uint(char * icon);
  58. #ifdef DEBUG_ACCOUNT
  59. extern unsigned int account_get_numattr_real(t_account * account, char const * key, char const * fn, unsigned int ln)
  60. #else
  61. extern unsigned int account_get_numattr(t_account * account, char const * key)
  62. #endif
  63. {
  64.     char const * temp;
  65.     unsigned int val;
  66.     
  67.     if (!account)
  68.     {
  69. #ifdef DEBUG_ACCOUNT
  70. eventlog(eventlog_level_error,"account_get_numattr","got NULL account (from %s:%u)",fn,ln);
  71. #else
  72. eventlog(eventlog_level_error,"account_get_numattr","got NULL account");
  73. #endif
  74. return 0;
  75.     }
  76.     if (!key)
  77.     {
  78. #ifdef DEBUG_ACCOUNT
  79. eventlog(eventlog_level_error,"account_get_numattr","got NULL key (from %s:%u)",fn,ln);
  80. #else
  81. eventlog(eventlog_level_error,"account_get_numattr","got NULL key");
  82. #endif
  83. return 0;
  84.     }
  85.     
  86.     if (!(temp = account_get_strattr(account,key)))
  87. return 0;
  88.     
  89.     if (str_to_uint(temp,&val)<0)
  90.     {
  91. eventlog(eventlog_level_error,"account_get_numattr","not a numeric string "%s" for key "%s"",temp,key);
  92. account_unget_strattr(temp);
  93. return 0;
  94.     }
  95.     account_unget_strattr(temp);
  96.     
  97.     return val;
  98. }
  99. extern int account_set_numattr(t_account * account, char const * key, unsigned int val)
  100. {
  101.     char temp[32]; /* should be more than enough room */
  102.     
  103.     if (!account)
  104.     {
  105. eventlog(eventlog_level_error,"account_set_numattr","got NULL account");
  106. return -1;
  107.     }
  108.     if (!key)
  109.     {
  110. eventlog(eventlog_level_error,"account_set_numattr","got NULL key");
  111. return -1;
  112.     }
  113.     
  114.     sprintf(temp,"%u",val);
  115.     return account_set_strattr(account,key,temp);
  116. }
  117. #ifdef DEBUG_ACCOUNT
  118. extern int account_get_boolattr_real(t_account * account, char const * key, char const * fn, unsigned int ln)
  119. #else
  120. extern int account_get_boolattr(t_account * account, char const * key)
  121. #endif
  122. {
  123.     char const * temp;
  124.     
  125.     if (!account)
  126.     {
  127. #ifdef DEBUG_ACCOUNT
  128. eventlog(eventlog_level_error,"account_get_boolattr","got NULL account (from %s:%u)",fn,ln);
  129. #else
  130. eventlog(eventlog_level_error,"account_get_boolattr","got NULL account");
  131. #endif
  132. return -1;
  133.     }
  134.     if (!key)
  135.     {
  136. #ifdef DEBUG_ACCOUNT
  137. eventlog(eventlog_level_error,"account_get_boolattr","got NULL key (from %s:%u)",fn,ln);
  138. #else
  139. eventlog(eventlog_level_error,"account_get_boolattr","got NULL key");
  140. #endif
  141. return -1;
  142.     }
  143.     
  144.     if (!(temp = account_get_strattr(account,key)))
  145. return -1;
  146.     
  147.     switch (str_get_bool(temp))
  148.     {
  149.     case 1:
  150. account_unget_strattr(temp);
  151. return 1;
  152.     case 0:
  153. account_unget_strattr(temp);
  154. return 0;
  155.     default:
  156. account_unget_strattr(temp);
  157. eventlog(eventlog_level_error,"account_get_boolattr","bad boolean value "%s" for key "%s"",temp,key);
  158. return -1;
  159.     }
  160. }
  161. extern int account_set_boolattr(t_account * account, char const * key, int val)
  162. {
  163.     if (!account)
  164.     {
  165. eventlog(eventlog_level_error,"account_set_boolattr","got NULL account");
  166. return -1;
  167.     }
  168.     if (!key)
  169.     {
  170. eventlog(eventlog_level_error,"account_set_boolattr","got NULL key");
  171. return -1;
  172.     }
  173.     
  174.     return account_set_strattr(account,key,val?"true":"false");
  175. }
  176. /****************************************************************/
  177. #ifdef DEBUG_ACCOUNT
  178. extern int account_unget_name_real(char const * name, char const * fn, unsigned int ln)
  179. #else
  180. extern int account_unget_name(char const * name)
  181. #endif
  182. {
  183.     if (!name)
  184.     {
  185. #ifdef DEBUG_ACCOUNT
  186. eventlog(eventlog_level_error,"account_unget_name","got NULL name (from %s:%u)",fn,ln);
  187. #else
  188. eventlog(eventlog_level_error,"account_unget_name","got NULL name");
  189. #endif
  190. return -1;
  191.     }
  192.     
  193.     return account_unget_strattr(name);
  194. }
  195. extern char const * account_get_pass(t_account * account)
  196. {
  197.     return account_get_strattr(account,"BNET\acct\passhash1");
  198. }
  199. extern int account_set_pass(t_account * account, char const * passhash1)
  200. {
  201.     return account_set_strattr(account,"BNET\acct\passhash1",passhash1);
  202. }
  203. extern int account_unget_pass(char const * pass)
  204. {
  205.     return account_unget_strattr(pass);
  206. }
  207. /****************************************************************/
  208. extern int account_get_auth_admin(t_account * account, char const * channelname)
  209. {
  210.     char temp[256];
  211.     
  212.     if (!channelname)
  213. return account_get_boolattr(account, "BNET\auth\admin");
  214.     
  215.     sprintf(temp,"BNET\auth\admin\%.100s",channelname);
  216.     return account_get_boolattr(account, temp);
  217. }
  218. extern int account_set_auth_admin(t_account * account, char const * channelname, int val)
  219. {
  220.     char temp[256];
  221.     
  222.     if (!channelname)
  223. return account_set_boolattr(account, "BNET\auth\admin", val);
  224.     
  225.     sprintf(temp,"BNET\auth\admin\%.100s",channelname);
  226.     return account_set_boolattr(account, temp, val);
  227. }
  228. extern int account_get_auth_announce(t_account * account)
  229. {
  230.     return account_get_boolattr(account,"BNET\auth\announce");
  231. }
  232. extern int account_get_auth_botlogin(t_account * account)
  233. {
  234.     return account_get_boolattr(account,"BNET\auth\botlogin");
  235. }
  236. extern int account_get_auth_bnetlogin(t_account * account)
  237. {
  238.     return account_get_boolattr(account,"BNET\auth\normallogin");
  239. }
  240. extern int account_get_auth_operator(t_account * account, char const * channelname)
  241. {
  242.     char temp[256];
  243.     
  244.     if (!channelname)
  245. return account_get_boolattr(account,"BNET\auth\operator");
  246.     
  247.     sprintf(temp,"BNET\auth\operator\%.100s",channelname);
  248.     return account_get_boolattr(account,temp);
  249. }
  250. extern int account_set_auth_operator(t_account * account, char const * channelname, int val)
  251. {
  252.     char temp[256];
  253.     
  254.     if (!channelname)
  255. return account_set_boolattr(account, "BNET\auth\operator", val);
  256.     sprintf(temp,"BNET\auth\operator\%.100s",channelname);
  257.     return account_set_boolattr(account, temp, val);
  258. }
  259. extern int account_get_auth_voice(t_account * account, char const * channelname)
  260. {
  261.     char temp[256];
  262.     sprintf(temp,"BNET\auth\voice\%.100s",channelname);
  263.     return account_get_boolattr(account,temp);
  264. }
  265. extern int account_set_auth_voice(t_account * account, char const * channelname, int val)
  266. {
  267.     char temp[256];
  268.     sprintf(temp,"BNET\auth\voice\%.100s",channelname);
  269.     return account_set_boolattr(account, temp, val);
  270. }
  271. extern int account_get_auth_changepass(t_account * account)
  272. {
  273.     return account_get_boolattr(account,"BNET\auth\changepass");
  274. }
  275. extern int account_get_auth_changeprofile(t_account * account)
  276. {
  277.     return account_get_boolattr(account,"BNET\auth\changeprofile");
  278. }
  279. extern int account_get_auth_createnormalgame(t_account * account)
  280. {
  281.     return account_get_boolattr(account,"BNET\auth\createnormalgame");
  282. }
  283. extern int account_get_auth_joinnormalgame(t_account * account)
  284. {
  285.     return account_get_boolattr(account,"BNET\auth\joinnormalgame");
  286. }
  287. extern int account_get_auth_createladdergame(t_account * account)
  288. {
  289.     return account_get_boolattr(account,"BNET\auth\createladdergame");
  290. }
  291. extern int account_get_auth_joinladdergame(t_account * account)
  292. {
  293.     return account_get_boolattr(account,"BNET\auth\joinladdergame");
  294. }
  295. extern int account_get_auth_lock(t_account * account)
  296. {
  297.     return account_get_boolattr(account,"BNET\auth\lockk");
  298. }
  299. extern int account_set_auth_lock(t_account * account, int val)
  300. {
  301.     return account_set_boolattr(account,"BNET\auth\lockk",val);
  302. }
  303. /****************************************************************/
  304. extern char const * account_get_sex(t_account * account)
  305. {
  306.     char const * temp;
  307.     
  308.     if (!account)
  309.     {
  310. eventlog(eventlog_level_error,"account_get_sex","got NULL account");
  311. return NULL;
  312.     }
  313.     
  314.     if (!(temp = account_get_strattr(account,"profile\sex")))
  315. return "";
  316.     return temp;
  317. }
  318. extern int account_unget_sex(char const * sex)
  319. {
  320.     return account_unget_strattr(sex);
  321. }
  322. extern char const * account_get_age(t_account * account)
  323. {
  324.     char const * temp;
  325.     
  326.     if (!account)
  327.     {
  328. eventlog(eventlog_level_error,"account_get_age","got NULL account");
  329. return NULL;
  330.     }
  331.     
  332.     if (!(temp = account_get_strattr(account,"profile\age")))
  333. return "";
  334.     return temp;
  335. }
  336. extern int account_unget_age(char const * age)
  337. {
  338.     return account_unget_strattr(age);
  339. }
  340. extern char const * account_get_loc(t_account * account)
  341. {
  342.     char const * temp;
  343.     
  344.     if (!account)
  345.     {
  346. eventlog(eventlog_level_error,"account_get_loc","got NULL account");
  347. return NULL;
  348.     }
  349.     
  350.     if (!(temp = account_get_strattr(account,"profile\location")))
  351. return "";
  352.     return temp;
  353. }
  354. extern int account_unget_loc(char const * loc)
  355. {
  356.     return account_unget_strattr(loc);
  357. }
  358. extern char const * account_get_desc(t_account * account)
  359. {
  360.     char const * temp;
  361.     
  362.     if (!account)
  363.     {
  364. eventlog(eventlog_level_error,"account_get_desc","got NULL account");
  365. return NULL;
  366.     }
  367.     
  368.     if (!(temp = account_get_strattr(account,"profile\description")))
  369. return "";
  370.     return temp;
  371. }
  372. extern int account_unget_desc(char const * desc)
  373. {
  374.     return account_unget_strattr(desc);
  375. }
  376. /****************************************************************/
  377. extern unsigned int account_get_ll_time(t_account * account)
  378. {
  379.     return account_get_numattr(account,"BNET\acct\lastlogin_time");
  380. }
  381. extern int account_set_ll_time(t_account * account, unsigned int t)
  382. {
  383.     return account_set_numattr(account,"BNET\acct\lastlogin_time",t);
  384. }
  385. extern char const * account_get_ll_clienttag(t_account * account)
  386. {
  387.     return account_get_strattr(account,"BNET\acct\lastlogin_clienttag");
  388. }
  389. extern int account_unget_ll_clienttag(char const * clienttag)
  390. {
  391.     return account_unget_strattr(clienttag);
  392. }
  393. extern int account_set_ll_clienttag(t_account * account, char const * clienttag)
  394. {
  395.     return account_set_strattr(account,"BNET\acct\lastlogin_clienttag",clienttag);
  396. }
  397. extern char const * account_get_ll_user(t_account * account)
  398. {
  399.     return account_get_strattr(account,"BNET\acct\lastlogin_user");
  400. }
  401. extern int account_unget_ll_user(char const * user)
  402. {
  403.     return account_unget_strattr(user);
  404. }
  405. extern int account_set_ll_user(t_account * account, char const * user)
  406. {
  407.     return account_set_strattr(account,"BNET\acct\lastlogin_user",user);
  408. }
  409. extern char const * account_get_ll_owner(t_account * account)
  410. {
  411.     return account_get_strattr(account,"BNET\acct\lastlogin_owner");
  412. }
  413. extern int account_unget_ll_owner(char const * owner)
  414. {
  415.     return account_unget_strattr(owner);
  416. }
  417. extern int account_set_ll_owner(t_account * account, char const * owner)
  418. {
  419.     return account_set_strattr(account,"BNET\acct\lastlogin_owner",owner);
  420. }
  421. extern char const * account_get_ll_ip(t_account * account)
  422. {
  423.     return account_get_strattr(account,"BNET\acct\lastlogin_ip");
  424. }
  425. extern int account_unget_ll_ip(char const * ip)
  426. {
  427.     return account_unget_strattr(ip);
  428. }
  429. extern int account_set_ll_ip(t_account * account, char const * ip)
  430. {
  431.     return account_set_strattr(account,"BNET\acct\lastlogin_ip",ip);
  432. }
  433. /****************************************************************/
  434. extern unsigned int account_get_normal_wins(t_account * account, char const * clienttag)
  435. {
  436.     char key[256];
  437.     
  438.     if (!clienttag || strlen(clienttag)!=4)
  439.     {
  440. eventlog(eventlog_level_error,"account_get_normal_wins","got bad clienttag");
  441. return 0;
  442.     }
  443.     sprintf(key,"Record\%s\0\wins",clienttag);
  444.     return account_get_numattr(account,key);
  445. }
  446. extern int account_inc_normal_wins(t_account * account, char const * clienttag)
  447. {
  448.     char key[256];
  449.     
  450.     if (!clienttag || strlen(clienttag)!=4)
  451.     {
  452. eventlog(eventlog_level_error,"account_inc_normal_wins","got bad clienttag");
  453. return -1;
  454.     }
  455.     sprintf(key,"Record\%s\0\wins",clienttag);
  456.     return account_set_numattr(account,key,account_get_normal_wins(account,clienttag)+1);
  457. }
  458. extern unsigned int account_get_normal_losses(t_account * account, char const * clienttag)
  459. {
  460.     char key[256];
  461.     
  462.     if (!clienttag || strlen(clienttag)!=4)
  463.     {
  464. eventlog(eventlog_level_error,"account_get_normal_losses","got bad clienttag");
  465. return 0;
  466.     }
  467.     sprintf(key,"Record\%s\0\losses",clienttag);
  468.     return account_get_numattr(account,key);
  469. }
  470. extern int account_inc_normal_losses(t_account * account, char const * clienttag)
  471. {
  472.     char key[256];
  473.     
  474.     if (!clienttag || strlen(clienttag)!=4)
  475.     {
  476. eventlog(eventlog_level_error,"account_inc_normal_losses","got bad clienttag");
  477. return -1;
  478.     }
  479.     sprintf(key,"Record\%s\0\losses",clienttag);
  480.     return account_set_numattr(account,key,account_get_normal_losses(account,clienttag)+1);
  481. }
  482. extern unsigned int account_get_normal_draws(t_account * account, char const * clienttag)
  483. {
  484.     char key[256];
  485.     
  486.     if (!clienttag || strlen(clienttag)!=4)
  487.     {
  488. eventlog(eventlog_level_error,"account_get_normal_draws","got bad clienttag");
  489. return 0;
  490.     }
  491.     sprintf(key,"Record\%s\0\draws",clienttag);
  492.     return account_get_numattr(account,key);
  493. }
  494. extern int account_inc_normal_draws(t_account * account, char const * clienttag)
  495. {
  496.     char key[256];
  497.     
  498.     if (!clienttag || strlen(clienttag)!=4)
  499.     {
  500. eventlog(eventlog_level_error,"account_inc_normal_draws","got bad clienttag");
  501. return -1;
  502.     }
  503.     sprintf(key,"Record\%s\0\draws",clienttag);
  504.     return account_set_numattr(account,key,account_get_normal_draws(account,clienttag)+1);
  505. }
  506. extern unsigned int account_get_normal_disconnects(t_account * account, char const * clienttag)
  507. {
  508.     char key[256];
  509.     
  510.     if (!clienttag || strlen(clienttag)!=4)
  511.     {
  512. eventlog(eventlog_level_error,"account_get_normal_disconnects","got bad clienttag");
  513. return 0;
  514.     }
  515.     sprintf(key,"Record\%s\0\disconnects",clienttag);
  516.     return account_get_numattr(account,key);
  517. }
  518. extern int account_inc_normal_disconnects(t_account * account, char const * clienttag)
  519. {
  520.     char key[256];
  521.     
  522.     if (!clienttag || strlen(clienttag)!=4)
  523.     {
  524. eventlog(eventlog_level_error,"account_inc_normal_disconnects","got bad clienttag");
  525. return -1;
  526.     }
  527.     sprintf(key,"Record\%s\0\disconnects",clienttag);
  528.     return account_set_numattr(account,key,account_get_normal_disconnects(account,clienttag)+1);
  529. }
  530. extern int account_set_normal_last_time(t_account * account, char const * clienttag, t_bnettime t)
  531. {
  532.     char key[256];
  533.     
  534.     if (!clienttag || strlen(clienttag)!=4)
  535.     {
  536. eventlog(eventlog_level_error,"account_set_normal_last_time","got bad clienttag");
  537. return -1;
  538.     }
  539.     sprintf(key,"Record\%s\0\last game",clienttag);
  540.     return account_set_strattr(account,key,bnettime_get_str(t));
  541. }
  542. extern int account_set_normal_last_result(t_account * account, char const * clienttag, char const * result)
  543. {
  544.     char key[256];
  545.     
  546.     if (!clienttag || strlen(clienttag)!=4)
  547.     {
  548. eventlog(eventlog_level_error,"account_set_normal_last_result","got bad clienttag");
  549. return -1;
  550.     }
  551.     sprintf(key,"Record\%s\0\last game result",clienttag);
  552.     return account_set_strattr(account,key,result);
  553. }
  554. /****************************************************************/
  555. extern unsigned int account_get_ladder_active_wins(t_account * account, char const * clienttag, t_ladder_id id)
  556. {
  557.     char key[256];
  558.     
  559.     if (!clienttag || strlen(clienttag)!=4)
  560.     {
  561. eventlog(eventlog_level_error,"account_get_ladder_active_wins","got bad clienttag");
  562. return 0;
  563.     }
  564.     sprintf(key,"Record\%s\%d\active wins",clienttag,(int)id);
  565.     return account_get_numattr(account,key);
  566. }
  567. extern int account_set_ladder_active_wins(t_account * account, char const * clienttag, t_ladder_id id, unsigned int wins)
  568. {
  569.     char key[256];
  570.     
  571.     if (!clienttag || strlen(clienttag)!=4)
  572.     {
  573. eventlog(eventlog_level_error,"account_set_ladder_active_wins","got bad clienttag");
  574. return -1;
  575.     }
  576.     sprintf(key,"Record\%s\%d\active wins",clienttag,(int)id);
  577.     return account_set_numattr(account,key,wins);
  578. }
  579. extern unsigned int account_get_ladder_active_losses(t_account * account, char const * clienttag, t_ladder_id id)
  580. {
  581.     char key[256];
  582.     
  583.     if (!clienttag || strlen(clienttag)!=4)
  584.     {
  585. eventlog(eventlog_level_error,"account_get_ladder_active_losses","got bad clienttag");
  586. return 0;
  587.     }
  588.     sprintf(key,"Record\%s\%d\active losses",clienttag,(int)id);
  589.     return account_get_numattr(account,key);
  590. }
  591. extern int account_set_ladder_active_losses(t_account * account, char const * clienttag, t_ladder_id id, unsigned int losses)
  592. {
  593.     char key[256];
  594.     
  595.     if (!clienttag || strlen(clienttag)!=4)
  596.     {
  597. eventlog(eventlog_level_error,"account_set_ladder_active_losses","got bad clienttag");
  598. return -1;
  599.     }
  600.     sprintf(key,"Record\%s\%d\active losses",clienttag,(int)id);
  601.     return account_set_numattr(account,key,losses);
  602. }
  603. extern unsigned int account_get_ladder_active_draws(t_account * account, char const * clienttag, t_ladder_id id)
  604. {
  605.     char key[256];
  606.     
  607.     if (!clienttag || strlen(clienttag)!=4)
  608.     {
  609. eventlog(eventlog_level_error,"account_get_ladder_active_draws","got bad clienttag");
  610. return 0;
  611.     }
  612.     sprintf(key,"Record\%s\%d\active draws",clienttag,(int)id);
  613.     return account_get_numattr(account,key);
  614. }
  615. extern int account_set_ladder_active_draws(t_account * account, char const * clienttag, t_ladder_id id, unsigned int draws)
  616. {
  617.     char key[256];
  618.     
  619.     if (!clienttag || strlen(clienttag)!=4)
  620.     {
  621. eventlog(eventlog_level_error,"account_set_ladder_active_draws","got bad clienttag");
  622. return -1;
  623.     }
  624.     sprintf(key,"Record\%s\%d\active draws",clienttag,(int)id);
  625.     return account_set_numattr(account,key,draws);
  626. }
  627. extern unsigned int account_get_ladder_active_disconnects(t_account * account, char const * clienttag, t_ladder_id id)
  628. {
  629.     char key[256];
  630.     
  631.     if (!clienttag || strlen(clienttag)!=4)
  632.     {
  633. eventlog(eventlog_level_error,"account_get_ladder_active_disconnects","got bad clienttag");
  634. return 0;
  635.     }
  636.     sprintf(key,"Record\%s\%d\active disconnects",clienttag,(int)id);
  637.     return account_get_numattr(account,key);
  638. }
  639. extern int account_set_ladder_active_disconnects(t_account * account, char const * clienttag, t_ladder_id id, unsigned int disconnects)
  640. {
  641.     char key[256];
  642.     
  643.     if (!clienttag || strlen(clienttag)!=4)
  644.     {
  645. eventlog(eventlog_level_error,"account_set_ladder_active_disconnects","got bad clienttag");
  646. return -1;
  647.     }
  648.     sprintf(key,"Record\%s\%d\active disconnects",clienttag,(int)id);
  649.     return account_set_numattr(account,key,disconnects);
  650. }
  651. extern unsigned int account_get_ladder_active_rating(t_account * account, char const * clienttag, t_ladder_id id)
  652. {
  653.     char key[256];
  654.     
  655.     if (!clienttag || strlen(clienttag)!=4)
  656.     {
  657. eventlog(eventlog_level_error,"account_get_ladder_active_rating","got bad clienttag");
  658. return 0;
  659.     }
  660.     sprintf(key,"Record\%s\%d\active rating",clienttag,(int)id);
  661.     return account_get_numattr(account,key);
  662. }
  663. extern int account_set_ladder_active_rating(t_account * account, char const * clienttag, t_ladder_id id, unsigned int rating)
  664. {
  665.     char key[256];
  666.     
  667.     if (!clienttag || strlen(clienttag)!=4)
  668.     {
  669. eventlog(eventlog_level_error,"account_set_ladder_active_rating","got bad clienttag");
  670. return -1;
  671.     }
  672.     sprintf(key,"Record\%s\%d\active rating",clienttag,(int)id);
  673.     return account_set_numattr(account,key,rating);
  674. }
  675. extern int account_get_ladder_active_rank(t_account * account, char const * clienttag, t_ladder_id id)
  676. {
  677.     char key[256];
  678.     
  679.     if (!clienttag || strlen(clienttag)!=4)
  680.     {
  681. eventlog(eventlog_level_error,"account_get_ladder_active_rank","got bad clienttag");
  682. return 0;
  683.     }
  684.     sprintf(key,"Record\%s\%d\active rank",clienttag,(int)id);
  685.     return account_get_numattr(account,key);
  686. }
  687. extern int account_set_ladder_active_rank(t_account * account, char const * clienttag, t_ladder_id id, unsigned int rank)
  688. {
  689.     char key[256];
  690.     
  691.     if (!clienttag || strlen(clienttag)!=4)
  692.     {
  693. eventlog(eventlog_level_error,"account_set_ladder_active_rank","got bad clienttag");
  694. return -1;
  695.     }
  696.     sprintf(key,"Record\%s\%d\active rank",clienttag,(int)id);
  697.     return account_set_numattr(account,key,rank);
  698. }
  699. extern char const * account_get_ladder_active_last_time(t_account * account, char const * clienttag, t_ladder_id id)
  700. {
  701.     char key[256];
  702.     
  703.     if (!clienttag || strlen(clienttag)!=4)
  704.     {
  705. eventlog(eventlog_level_error,"account_get_ladder_active_last_time","got bad clienttag");
  706. return NULL;
  707.     }
  708.     sprintf(key,"Record\%s\%d\active last game",clienttag,(int)id);
  709.     return account_get_strattr(account,key);
  710. }
  711. extern int account_set_ladder_active_last_time(t_account * account, char const * clienttag, t_ladder_id id, t_bnettime t)
  712. {
  713.     char key[256];
  714.     
  715.     if (!clienttag || strlen(clienttag)!=4)
  716.     {
  717. eventlog(eventlog_level_error,"account_set_ladder_active_last_time","got bad clienttag");
  718. return -1;
  719.     }
  720.     sprintf(key,"Record\%s\%d\active last game",clienttag,(int)id);
  721.     return account_set_strattr(account,key,bnettime_get_str(t));
  722. }
  723. /****************************************************************/
  724. extern unsigned int account_get_ladder_wins(t_account * account, char const * clienttag, t_ladder_id id)
  725. {
  726.     char key[256];
  727.     
  728.     if (!clienttag || strlen(clienttag)!=4)
  729.     {
  730. eventlog(eventlog_level_error,"account_get_ladder_wins","got bad clienttag");
  731. return 0;
  732.     }
  733.     sprintf(key,"Record\%s\%d\wins",clienttag,(int)id);
  734.     return account_get_numattr(account,key);
  735. }
  736. extern int account_inc_ladder_wins(t_account * account, char const * clienttag, t_ladder_id id)
  737. {
  738.     char key[256];
  739.     
  740.     if (!clienttag || strlen(clienttag)!=4)
  741.     {
  742. eventlog(eventlog_level_error,"account_inc_ladder_wins","got bad clienttag");
  743. return -1;
  744.     }
  745.     sprintf(key,"Record\%s\%d\wins",clienttag,(int)id);
  746.     return account_set_numattr(account,key,account_get_ladder_wins(account,clienttag,id)+1);
  747. }
  748. extern unsigned int account_get_ladder_losses(t_account * account, char const * clienttag, t_ladder_id id)
  749. {
  750.     char key[256];
  751.     
  752.     if (!clienttag || strlen(clienttag)!=4)
  753.     {
  754. eventlog(eventlog_level_error,"account_get_ladder_losses","got bad clienttag");
  755. return 0;
  756.     }
  757.     sprintf(key,"Record\%s\%d\losses",clienttag,(int)id);
  758.     return account_get_numattr(account,key);
  759. }
  760. extern int account_inc_ladder_losses(t_account * account, char const * clienttag, t_ladder_id id)
  761. {
  762.     char key[256];
  763.     
  764.     if (!clienttag || strlen(clienttag)!=4)
  765.     {
  766.        eventlog(eventlog_level_error,"account_inc_ladder_losses","got bad clienttag");
  767.        return -1;
  768.     }
  769.     sprintf(key,"Record\%s\%d\losses",clienttag,(int)id);
  770.     return account_set_numattr(account,key,account_get_ladder_losses(account,clienttag,id)+1);
  771. }
  772. extern unsigned int account_get_ladder_draws(t_account * account, char const * clienttag, t_ladder_id id)
  773. {
  774.     char key[256];
  775.     
  776.     if (!clienttag || strlen(clienttag)!=4)
  777.     {
  778. eventlog(eventlog_level_error,"account_get_ladder_draws","got bad clienttag");
  779. return 0;
  780.     }
  781.     sprintf(key,"Record\%s\%d\draws",clienttag,(int)id);
  782.     return account_get_numattr(account,key);
  783. }
  784. extern int account_inc_ladder_draws(t_account * account, char const * clienttag, t_ladder_id id)
  785. {
  786.     char key[256];
  787.     
  788.     if (!clienttag || strlen(clienttag)!=4)
  789.     {
  790.        eventlog(eventlog_level_error,"account_inc_ladder_draws","got bad clienttag");
  791.        return -1;
  792.     }
  793.     sprintf(key,"Record\%s\%d\draws",clienttag,(int)id);
  794.     return account_set_numattr(account,key,account_get_ladder_draws(account,clienttag,id)+1);
  795. }
  796. extern unsigned int account_get_ladder_disconnects(t_account * account, char const * clienttag, t_ladder_id id)
  797. {
  798.     char key[256];
  799.     
  800.     if (!clienttag || strlen(clienttag)!=4)
  801.     {
  802. eventlog(eventlog_level_error,"account_get_ladder_disconnects","got bad clienttag");
  803. return 0;
  804.     }
  805.     sprintf(key,"Record\%s\%d\disconnects",clienttag,(int)id);
  806.     return account_get_numattr(account,key);
  807. }
  808. extern int account_inc_ladder_disconnects(t_account * account, char const * clienttag, t_ladder_id id)
  809. {
  810.     char key[256];
  811.     
  812.     if (!clienttag || strlen(clienttag)!=4)
  813.     {
  814.        eventlog(eventlog_level_error,"account_inc_ladder_disconnects","got bad clienttag");
  815.        return -1;
  816.     }
  817.     sprintf(key,"Record\%s\%d\disconnects",clienttag,(int)id);
  818.     return account_set_numattr(account,key,account_get_ladder_disconnects(account,clienttag,id)+1);
  819. }
  820. extern unsigned int account_get_ladder_rating(t_account * account, char const * clienttag, t_ladder_id id)
  821. {
  822.     char key[256];
  823.     
  824.     if (!clienttag || strlen(clienttag)!=4)
  825.     {
  826. eventlog(eventlog_level_error,"account_get_ladder_rating","got bad clienttag");
  827. return 0;
  828.     }
  829.     sprintf(key,"Record\%s\%d\rating",clienttag,(int)id);
  830.     return account_get_numattr(account,key);
  831. }
  832. extern int account_adjust_ladder_rating(t_account * account, char const * clienttag, t_ladder_id id, int delta)
  833. {
  834.     char         key[256];
  835.     unsigned int oldrating;
  836.     unsigned int newrating;
  837.     int          retval=0;
  838.     
  839.     if (!clienttag || strlen(clienttag)!=4)
  840.     {
  841.        eventlog(eventlog_level_error,"account_adjust_ladder_rating","got bad clienttag");
  842.        return -1;
  843.     }
  844.     sprintf(key,"Record\%s\%d\rating",clienttag,(int)id);
  845.     /* don't allow rating to go below 1 */
  846.     oldrating = account_get_ladder_rating(account,clienttag,id);
  847.     if (delta<0 && oldrating<=(unsigned int)-delta)
  848.         newrating = 1;
  849.     else
  850.         newrating = oldrating+delta;
  851.     if (account_set_numattr(account,key,newrating)<0)
  852. retval = -1;
  853.     
  854.     if (newrating>account_get_ladder_high_rating(account,clienttag,id))
  855.     {
  856. sprintf(key,"Record\%s\%d\high rating",clienttag,(int)id);
  857. if (account_set_numattr(account,key,newrating)<0)
  858.     retval = -1;
  859.     }
  860.     
  861.     return retval;
  862. }
  863. extern int account_get_ladder_rank(t_account * account, char const * clienttag, t_ladder_id id)
  864. {
  865.     char key[256];
  866.     
  867.     if (!clienttag || strlen(clienttag)!=4)
  868.     {
  869. eventlog(eventlog_level_error,"account_get_ladder_rank","got bad clienttag");
  870. return 0;
  871.     }
  872.     sprintf(key,"Record\%s\%d\rank",clienttag,(int)id);
  873.     return account_get_numattr(account,key);
  874. }
  875. extern int account_set_ladder_rank(t_account * account, char const * clienttag, t_ladder_id id, unsigned int rank)
  876. {
  877.     char         key[256];
  878.     unsigned int oldrank;
  879.     int          retval=0;
  880.     
  881.     if (!clienttag || strlen(clienttag)!=4)
  882.     {
  883.        eventlog(eventlog_level_error,"account_set_ladder_rank","got bad clienttag");
  884.        return -1;
  885.     }
  886.     // if (rank==0)
  887.     //    eventlog(eventlog_level_warn,"account_set_ladder_rank","setting rank to zero?");
  888.     sprintf(key,"Record\%s\%d\rank",clienttag,(int)id);
  889.     if (account_set_numattr(account,key,rank)<0)
  890. retval = -1;
  891.     
  892.     oldrank = account_get_ladder_high_rank(account,clienttag,id);
  893.     if (oldrank==0 || rank<oldrank)
  894.     {
  895. sprintf(key,"Record\%s\%d\high rank",clienttag,(int)id);
  896. if (account_set_numattr(account,key,rank)<0)
  897.     retval = -1;
  898.     }
  899.     return retval;
  900. }
  901. extern unsigned int account_get_ladder_high_rating(t_account * account, char const * clienttag, t_ladder_id id)
  902. {
  903.     char key[256];
  904.     
  905.     if (!clienttag || strlen(clienttag)!=4)
  906.     {
  907. eventlog(eventlog_level_error,"account_get_ladder_high_rating","got bad clienttag");
  908. return 0;
  909.     }
  910.     sprintf(key,"Record\%s\%d\high rating",clienttag,(int)id);
  911.     return account_get_numattr(account,key);
  912. }
  913. extern unsigned int account_get_ladder_high_rank(t_account * account, char const * clienttag, t_ladder_id id)
  914. {
  915.     char key[256];
  916.     
  917.     if (!clienttag || strlen(clienttag)!=4)
  918.     {
  919. eventlog(eventlog_level_error,"account_get_ladder_high_rank","got bad clienttag");
  920. return 0;
  921.     }
  922.     sprintf(key,"Record\%s\%d\high_rank",clienttag,(int)id);
  923.     return account_get_numattr(account,key);
  924. }
  925. extern int account_set_ladder_last_time(t_account * account, char const * clienttag, t_ladder_id id, t_bnettime t)
  926. {
  927.     char key[256];
  928.     
  929.     if (!clienttag || strlen(clienttag)!=4)
  930.     {
  931. eventlog(eventlog_level_error,"account_set_ladder_last_time","got bad clienttag");
  932. return -1;
  933.     }
  934.     sprintf(key,"Record\%s\%d\last game",clienttag,(int)id);
  935.     return account_set_strattr(account,key,bnettime_get_str(t));
  936. }
  937. extern char const * account_get_ladder_last_time(t_account * account, char const * clienttag, t_ladder_id id)
  938. {
  939.     char key[256];
  940.     
  941.     if (!clienttag || strlen(clienttag)!=4)
  942.     {
  943. eventlog(eventlog_level_error,"account_get_ladder_last_time","got bad clienttag");
  944. return NULL;
  945.     }
  946.     sprintf(key,"Record\%s\%d\last game",clienttag,(int)id);
  947.     return account_get_strattr(account,key);
  948. }
  949. extern int account_set_ladder_last_result(t_account * account, char const * clienttag, t_ladder_id id, char const * result)
  950. {
  951.     char key[256];
  952.     
  953.     if (!clienttag || strlen(clienttag)!=4)
  954.     {
  955. eventlog(eventlog_level_error,"account_set_ladder_last_result","got bad clienttag");
  956. return -1;
  957.     }
  958.     sprintf(key,"Record\%s\%d\last game result",clienttag,(int)id);
  959.     return account_set_strattr(account,key,result);
  960. }
  961. /****************************************************************/
  962. extern unsigned int account_get_normal_level(t_account * account, char const * clienttag)
  963. {
  964.     char key[256];
  965.     
  966.     if (!clienttag || strlen(clienttag)!=4)
  967.     {
  968. eventlog(eventlog_level_error,"account_get_normal_level","got bad clienttag");
  969. return 0;
  970.     }
  971.     sprintf(key,"Record\%s\0\level",clienttag);
  972.     return account_get_numattr(account,key);
  973. }
  974. extern int account_set_normal_level(t_account * account, char const * clienttag, unsigned int level)
  975. {
  976.     char key[256];
  977.     
  978.     if (!clienttag || strlen(clienttag)!=4)
  979.     {
  980. eventlog(eventlog_level_error,"account_set_normal_level","got bad clienttag");
  981. return -1;
  982.     }
  983.     sprintf(key,"Record\%s\0\level",clienttag);
  984.     return account_set_numattr(account,key,level);
  985. }
  986. extern unsigned int account_get_normal_class(t_account * account, char const * clienttag)
  987. {
  988.     char key[256];
  989.     
  990.     if (!clienttag || strlen(clienttag)!=4)
  991.     {
  992. eventlog(eventlog_level_error,"account_get_normal_class","got bad clienttag");
  993. return 0;
  994.     }
  995.     sprintf(key,"Record\%s\0\class",clienttag);
  996.     return account_get_numattr(account,key);
  997. }
  998. extern int account_set_normal_class(t_account * account, char const * clienttag, unsigned int class)
  999. {
  1000.     char key[256];
  1001.     
  1002.     if (!clienttag || strlen(clienttag)!=4)
  1003.     {
  1004. eventlog(eventlog_level_error,"account_set_normal_class","got bad clienttag");
  1005. return -1;
  1006.     }
  1007.     sprintf(key,"Record\%s\0\class",clienttag);
  1008.     return account_set_numattr(account,key,class);
  1009. }
  1010. extern unsigned int account_get_normal_diablo_kills(t_account * account, char const * clienttag)
  1011. {
  1012.     char key[256];
  1013.     
  1014.     if (!clienttag || strlen(clienttag)!=4)
  1015.     {
  1016. eventlog(eventlog_level_error,"account_get_normal_diablo_kills","got bad clienttag");
  1017. return 0;
  1018.     }
  1019.     sprintf(key,"Record\%s\0\diablo kills",clienttag);
  1020.     return account_get_numattr(account,key);
  1021. }
  1022. extern int account_set_normal_diablo_kills(t_account * account, char const * clienttag, unsigned int diablo_kills)
  1023. {
  1024.     char key[256];
  1025.     
  1026.     if (!clienttag || strlen(clienttag)!=4)
  1027.     {
  1028. eventlog(eventlog_level_error,"account_set_normal_diablo_kills","got bad clienttag");
  1029. return -1;
  1030.     }
  1031.     sprintf(key,"Record\%s\0\diablo kills",clienttag);
  1032.     return account_set_numattr(account,key,diablo_kills);
  1033. }
  1034. extern unsigned int account_get_normal_strength(t_account * account, char const * clienttag)
  1035. {
  1036.     char key[256];
  1037.     
  1038.     if (!clienttag || strlen(clienttag)!=4)
  1039.     {
  1040. eventlog(eventlog_level_error,"account_get_normal_strength","got bad clienttag");
  1041. return 0;
  1042.     }
  1043.     sprintf(key,"Record\%s\0\strength",clienttag);
  1044.     return account_get_numattr(account,key);
  1045. }
  1046. extern int account_set_normal_strength(t_account * account, char const * clienttag, unsigned int strength)
  1047. {
  1048.     char key[256];
  1049.     
  1050.     if (!clienttag || strlen(clienttag)!=4)
  1051.     {
  1052. eventlog(eventlog_level_error,"account_set_normal_strength","got bad clienttag");
  1053. return -1;
  1054.     }
  1055.     sprintf(key,"Record\%s\0\strength",clienttag);
  1056.     return account_set_numattr(account,key,strength);
  1057. }
  1058. extern unsigned int account_get_normal_magic(t_account * account, char const * clienttag)
  1059. {
  1060.     char key[256];
  1061.     
  1062.     if (!clienttag || strlen(clienttag)!=4)
  1063.     {
  1064. eventlog(eventlog_level_error,"account_get_normal_magic","got bad clienttag");
  1065. return 0;
  1066.     }
  1067.     sprintf(key,"Record\%s\0\magic",clienttag);
  1068.     return account_get_numattr(account,key);
  1069. }
  1070. extern int account_set_normal_magic(t_account * account, char const * clienttag, unsigned int magic)
  1071. {
  1072.     char key[256];
  1073.     
  1074.     if (!clienttag || strlen(clienttag)!=4)
  1075.     {
  1076. eventlog(eventlog_level_error,"account_set_normal_magic","got bad clienttag");
  1077. return -1;
  1078.     }
  1079.     sprintf(key,"Record\%s\0\magic",clienttag);
  1080.     return account_set_numattr(account,key,magic);
  1081. }
  1082. extern unsigned int account_get_normal_dexterity(t_account * account, char const * clienttag)
  1083. {
  1084.     char key[256];
  1085.     
  1086.     if (!clienttag || strlen(clienttag)!=4)
  1087.     {
  1088. eventlog(eventlog_level_error,"account_get_normal_dexterity","got bad clienttag");
  1089. return 0;
  1090.     }
  1091.     sprintf(key,"Record\%s\0\dexterity",clienttag);
  1092.     return account_get_numattr(account,key);
  1093. }
  1094. extern int account_set_normal_dexterity(t_account * account, char const * clienttag, unsigned int dexterity)
  1095. {
  1096.     char key[256];
  1097.     
  1098.     if (!clienttag || strlen(clienttag)!=4)
  1099.     {
  1100. eventlog(eventlog_level_error,"account_set_normal_dexterity","got bad clienttag");
  1101. return -1;
  1102.     }
  1103.     sprintf(key,"Record\%s\0\dexterity",clienttag);
  1104.     return account_set_numattr(account,key,dexterity);
  1105. }
  1106. extern unsigned int account_get_normal_vitality(t_account * account, char const * clienttag)
  1107. {
  1108.     char key[256];
  1109.     
  1110.     if (!clienttag || strlen(clienttag)!=4)
  1111.     {
  1112. eventlog(eventlog_level_error,"account_get_normal_vitality","got bad clienttag");
  1113. return 0;
  1114.     }
  1115.     sprintf(key,"Record\%s\0\vitality",clienttag);
  1116.     return account_get_numattr(account,key);
  1117. }
  1118. extern int account_set_normal_vitality(t_account * account, char const * clienttag, unsigned int vitality)
  1119. {
  1120.     char key[256];
  1121.     
  1122.     if (!clienttag || strlen(clienttag)!=4)
  1123.     {
  1124. eventlog(eventlog_level_error,"account_set_normal_vitality","got bad clienttag");
  1125. return -1;
  1126.     }
  1127.     sprintf(key,"Record\%s\0\vitality",clienttag);
  1128.     return account_set_numattr(account,key,vitality);
  1129. }
  1130. extern unsigned int account_get_normal_gold(t_account * account, char const * clienttag)
  1131. {
  1132.     char key[256];
  1133.     
  1134.     if (!clienttag || strlen(clienttag)!=4)
  1135.     {
  1136. eventlog(eventlog_level_error,"account_get_normal_gold","got bad clienttag");
  1137. return 0;
  1138.     }
  1139.     sprintf(key,"Record\%s\0\gold",clienttag);
  1140.     return account_get_numattr(account,key);
  1141. }
  1142. extern int account_set_normal_gold(t_account * account, char const * clienttag, unsigned int gold)
  1143. {
  1144.     char key[256];
  1145.     
  1146.     if (!clienttag || strlen(clienttag)!=4)
  1147.     {
  1148. eventlog(eventlog_level_error,"account_set_normal_gold","got bad clienttag");
  1149. return -1;
  1150.     }
  1151.     sprintf(key,"Record\%s\0\gold",clienttag);
  1152.     return account_set_numattr(account,key,gold);
  1153. }
  1154. /****************************************************************/
  1155. extern int account_check_closed_character(t_account * account, char const * clienttag, char const * realmname, char const * charname)
  1156. {
  1157.     char const * charlist = account_get_closed_characterlist (account, clienttag, realmname);
  1158.     char         tempname[32];
  1159.     if (charlist == NULL)
  1160.     {
  1161.         eventlog(eventlog_level_debug,"account_check_closed_character","no characters in Realm %s",realmname);
  1162.     }
  1163.     else
  1164.     {
  1165.         char const * start;
  1166. char const * next_char;
  1167. int    list_len;
  1168. int    name_len;
  1169. int    i;
  1170. eventlog(eventlog_level_debug,"account_check_closed_character","got characterlist "%s" for Realm %s",charlist,realmname);
  1171. list_len  = strlen(charlist);
  1172. start     = charlist;
  1173. next_char = start;
  1174. for (i = 0; i < list_len; i++, next_char++)
  1175. {
  1176.     if (',' == *next_char)
  1177.     {
  1178.         name_len = next_char - start;
  1179.         strncpy(tempname, start, name_len);
  1180. tempname[name_len] = '';
  1181.         eventlog(eventlog_level_debug,"account_check_closed_character","found character "%s"",tempname);
  1182. if (strcmp(tempname, charname) == 0)
  1183.     return 1;
  1184. start = next_char + 1;
  1185.     }
  1186. }
  1187. name_len = next_char - start;
  1188. strncpy(tempname, start, name_len);
  1189. tempname[name_len] = '';
  1190. eventlog(eventlog_level_debug,"account_check_closed_character","found tail character "%s"",tempname);
  1191. if (strcmp(tempname, charname) == 0)
  1192.     return 1;
  1193.     }
  1194.     
  1195.     return 0;
  1196. }
  1197. extern char const * account_get_closed_characterlist(t_account * account, char const * clienttag, char const * realmname)
  1198. {
  1199.     char realmkey[256];
  1200.     
  1201.     if (!clienttag || strlen(clienttag)!=4)
  1202.     {
  1203. eventlog(eventlog_level_error,"account_get_closed_characterlist","got bad clienttag");
  1204. return NULL;
  1205.     }
  1206.     if (!realmname)
  1207.     {
  1208.         eventlog(eventlog_level_error,"account_get_closed_characterlist","got NULL realmname");
  1209. return NULL;
  1210.     }
  1211.     if (!account)
  1212.     {
  1213.         eventlog(eventlog_level_error,"account_get_closed_characterlist","got NULL account");
  1214. return NULL;
  1215.     }
  1216.     sprintf(realmkey,"BNET\CharacterList\%s\%s\0",clienttag,realmname);
  1217.     eventlog(eventlog_level_debug,"account_get_closed_characterlist","looking for '%s'",realmkey);
  1218.     return account_get_strattr(account, realmkey);
  1219. }
  1220. extern int account_unget_closed_characterlist(t_account * account, char const * charlist)
  1221. {
  1222.     return account_unget_strattr(charlist);
  1223. }
  1224. extern int account_set_closed_characterlist(t_account * account, char const * clienttag, char const * charlist)
  1225. {
  1226.     char key[256];
  1227.     
  1228.     if (!clienttag || strlen(clienttag)!=4)
  1229.     {
  1230. eventlog(eventlog_level_error,"account_set_closed_characterlist","got bad clienttag");
  1231. return -1;
  1232.     }
  1233.     eventlog(eventlog_level_debug,"account_set_closed_characterlist, clienttag='%s', charlist='%s'",clienttag,charlist);
  1234.     sprintf(key,"BNET\Characters\%s\0",clienttag);
  1235.     return account_set_strattr(account,key,charlist);
  1236. }
  1237. extern int account_add_closed_character(t_account * account, char const * clienttag, t_character * ch)
  1238. {
  1239.     char key[256];
  1240.     char hex_buffer[356];
  1241.     char chars_in_realm[256];
  1242.     char const * old_list;
  1243.     
  1244.     if (!clienttag || strlen(clienttag)!=4)
  1245.     {
  1246. eventlog(eventlog_level_error,"account_add_closed_character","got bad clienttag");
  1247. return -1;
  1248.     }
  1249.     if (!ch)
  1250.     {
  1251. eventlog(eventlog_level_error,"account_add_closed_character","got NULL character");
  1252. return -1;
  1253.     }
  1254.     eventlog(eventlog_level_debug,"account_add_closed_character","clienttag="%s", realm="%s", name="%s"",clienttag,ch->realmname,ch->name);
  1255.     sprintf(key,"BNET\CharacterList\%s\%s\0",clienttag,ch->realmname);
  1256.     old_list = account_get_strattr(account, key);
  1257.     if (old_list)
  1258.     {
  1259.         sprintf(chars_in_realm, "%s,%s", old_list, ch->name);
  1260.     }
  1261.     else
  1262.     {
  1263.         sprintf(chars_in_realm, "%s", ch->name);
  1264.     }
  1265.     eventlog(eventlog_level_debug,"account_add_closed_character","new character list for realm "%s" is "%s"", ch->realmname, chars_in_realm);
  1266.     account_set_strattr(account, key, chars_in_realm);
  1267.     sprintf(key,"BNET\Characters\%s\%s\%s\0",clienttag,ch->realmname,ch->name);
  1268.     str_to_hex(hex_buffer, ch->data, ch->datalen);
  1269.     account_set_strattr(account,key,hex_buffer);
  1270.     /*
  1271.     eventlog(eventlog_level_debug,"account_add_closed_character","key "%s"", key);
  1272.     eventlog(eventlog_level_debug,"account_add_closed_character","value "%s"", hex_buffer);
  1273.     */
  1274.     return 0;
  1275. }
  1276. /* ADDED BY THE UNDYING SOULZZ 4/10/02 - Clan Name for Profile Setting */
  1277. extern int account_set_w3_clanname( t_account * account, char const * acctsetclanname )
  1278. {
  1279. if ( acctsetclanname == NULL )
  1280. {
  1281. eventlog( eventlog_level_error,"account_set_w3_acctclanname","got NULL Clan Name. Not setting." );
  1282. return -1;
  1283.     }
  1284. eventlog( eventlog_level_debug,"account_set_w3_clanname","setting clanname to %s", acctsetclanname );
  1285. return account_set_strattr( account, "profile\clanname", acctsetclanname );
  1286. }
  1287. extern char const * account_get_w3_clanname( t_account * account)
  1288. {
  1289.     if ( account_get_strattr( account, "profile\clanname") == NULL ) /* doesn't exist, so add it */
  1290.     {
  1291.     account_set_w3_clanname( account, "" ); /* add line to account file but set with a NULL/Nothing*/
  1292. if ( account_get_strattr(account, "profile\clanname") == NULL )
  1293. {
  1294.     eventlog( eventlog_level_error, "account_get_w3_clanname", "User has not defined a clan name for /CLAN option" );
  1295.     return NULL;
  1296.         }
  1297.     }
  1298.     return account_get_strattr( account, "profile\clanname" );
  1299. }
  1300. // THEUNDYING 5/24/02 - PROFILE GET WINS/LOSSES/LEVELS..etc.. 
  1301. extern int account_set_friend( t_account * account, int friendnum, unsigned int frienduid )
  1302. {
  1303. char key[256];
  1304. if ( frienduid == 0 || friendnum < 0 || friendnum >= prefs_get_max_friends())
  1305. {
  1306. return -1;
  1307. }
  1308. sprintf(key, "friend\%d\uid", friendnum);
  1309. return account_set_numattr( account, key, frienduid);
  1310. }
  1311. extern unsigned int account_get_friend( t_account * account, int friendnum)
  1312. {
  1313.     char key[256];
  1314.     int tmp;
  1315.     char const * name;
  1316.     t_account * acct;
  1317.     if (friendnum < 0 || friendnum >= prefs_get_max_friends()) {
  1318. // bogus name (user himself) instead of NULL, otherwise clients might crash
  1319. eventlog(eventlog_level_error, __FUNCTION__, "invalid friendnum %d (max: %d)", friendnum, prefs_get_max_friends());
  1320. return 0;  
  1321.     }
  1322.     sprintf(key, "friend\%d\uid", friendnum);
  1323.     tmp = account_get_numattr(account, key);
  1324.     if(!tmp) {
  1325.         // ok, looks like we have a problem. Maybe friends still stored in old format?
  1326.         sprintf(key,"friend\%d\name",friendnum);
  1327.         name = account_get_strattr(account,key);
  1328.         if (name) 
  1329.         {
  1330.          if ((acct = accountlist_find_account(name)) != NULL)
  1331.             {
  1332.          tmp = account_get_uid(acct);
  1333.                 account_set_friend(account,friendnum,tmp);
  1334.                 account_set_strattr(account,key,NULL); //remove old username-based friend now                  
  1335.                 return tmp;
  1336.     }
  1337.             account_set_strattr(account,key,NULL); //remove old username-based friend now                  
  1338.     eventlog(eventlog_level_warn, __FUNCTION__, "unexistant friend name ('%s') in old storage format", name);
  1339.     return 0;
  1340.         }
  1341. eventlog(eventlog_level_error, __FUNCTION__, "could not find friend (friendno: %d of '%s')", friendnum, account_get_name(account));
  1342. return 0;
  1343.     }
  1344.     return tmp;
  1345. }
  1346. extern int account_set_friendcount( t_account * account, int count)
  1347. {
  1348. if (count < 0 || count > prefs_get_max_friends())
  1349. {
  1350. return -1;
  1351. }
  1352. return account_set_numattr( account, "friend\count", count);
  1353. }
  1354. extern int account_get_friendcount( t_account * account )
  1355. {
  1356.     return account_get_numattr( account, "friend\count" );
  1357. }
  1358. extern int account_add_friend( t_account * my_acc, t_account * facc)
  1359. {
  1360.     unsigned my_uid;
  1361.     unsigned fuid;
  1362.     int nf;
  1363.     t_list *flist;
  1364.     if (my_acc == NULL || facc == NULL) {
  1365. eventlog(eventlog_level_error, __FUNCTION__, "got NULL account");
  1366. return -1;
  1367.     }
  1368.     my_uid = account_get_uid(my_acc);
  1369.     fuid = account_get_uid(facc);
  1370.     if (my_acc == facc) return -2;
  1371.     nf = account_get_friendcount(my_acc);
  1372.     if (nf >= prefs_get_max_friends()) return -3;
  1373.     flist = account_get_friends(my_acc);
  1374.     if (flist == NULL) return -1;
  1375.     if (friendlist_find_account(flist, facc) != NULL) return -4;
  1376.     account_set_friend(my_acc, nf, fuid);
  1377.     account_set_friendcount(my_acc, nf + 1);
  1378.     if (account_check_mutual(facc, my_uid) == 0)
  1379. friendlist_add_account(flist, facc, 1);
  1380.     else
  1381. friendlist_add_account(flist, facc, 0);
  1382.     return 0;
  1383. }
  1384. extern int account_remove_friend( t_account * account, int friendnum )
  1385. {
  1386.     unsigned i;
  1387.     int n = account_get_friendcount(account);
  1388.     if (account == NULL) {
  1389. eventlog(eventlog_level_error, __FUNCTION__, "got NULL account");
  1390. return -1;
  1391.     }
  1392.     if (friendnum < 0 || friendnum >= n) {
  1393. eventlog(eventlog_level_error, __FUNCTION__, "got invalid friendnum (friendnum: %d max: %d)", friendnum, n);
  1394. return -1;
  1395.     }
  1396.     for(i = friendnum ; i < n - 1; i++)
  1397. account_set_friend(account, i, account_get_friend(account, i + 1));
  1398.     account_set_friend(account, n-1, 0); /* FIXME: should delete the attribute */
  1399.     account_set_friendcount(account, n-1);
  1400.     return 0;
  1401. }
  1402. extern int account_remove_friend2( t_account * account, const char * friend)
  1403. {
  1404.     t_list *flist;
  1405.     t_friend *fr;
  1406.     unsigned i, uid;
  1407.     int n;
  1408.     if (account == NULL) {
  1409. eventlog(eventlog_level_error, __FUNCTION__, "got NULL account");
  1410. return -1;
  1411.     }
  1412.     if (friend == NULL) {
  1413. eventlog(eventlog_level_error, __FUNCTION__, "got NULL friend username");
  1414. return -1;
  1415.     }
  1416.     if ((flist = account_get_friends(account)) == NULL)
  1417. return -1;
  1418.     if ((fr = friendlist_find_username(flist, friend)) == NULL) return -2;
  1419.     n = account_get_friendcount(account);
  1420.     uid = account_get_uid(friend_get_account(fr));
  1421.     for (i = 0; i < n; i++)
  1422. if (account_get_friend(account, i) == uid) {
  1423.          t_list * fflist;
  1424.          t_friend * ffr;
  1425.          t_account * facc;
  1426.     account_remove_friend(account, i);
  1427.          if((facc = friend_get_account(fr)) && 
  1428.        (fflist = account_get_friends(facc)) && 
  1429.        (ffr = friendlist_find_account(fflist, account)))
  1430.              friend_set_mutual(ffr, 0);
  1431.     friendlist_remove_friend(flist, fr);
  1432.     return i;
  1433. }
  1434.     return -2;
  1435. }
  1436. // Some Extra Commands for REAL admins to promote other users to Admins
  1437. // And Moderators of channels
  1438. extern int account_set_admin( t_account * account )
  1439. {
  1440. return account_set_strattr( account, "BNET\auth\admin", "true");
  1441. }
  1442. extern int account_set_demoteadmin( t_account * account )
  1443. {
  1444. return account_set_strattr( account, "BNET\auth\admin", "false" );
  1445. }
  1446. extern unsigned int account_get_command_groups(t_account * account)
  1447. {
  1448.     return account_get_numattr(account,"BNET\auth\command_groups");
  1449. }
  1450. extern int account_set_command_groups(t_account * account, unsigned int groups)
  1451. {
  1452.     return account_set_numattr(account,"BNET\auth\command_groups",groups);
  1453. }
  1454. // WAR3 Play Game & Profile Funcs
  1455. extern char const * race_get_str(unsigned int race)
  1456. {
  1457. switch(race) {
  1458. case W3_RACE_ORCS:
  1459.     return "orcs";
  1460. case W3_RACE_HUMANS:
  1461.     return "humans";
  1462. case W3_RACE_UNDEAD:
  1463.     return "undead";
  1464. case W3_RACE_NIGHTELVES:
  1465.     return "nightelves";
  1466. case W3_RACE_RANDOM:
  1467.     return "random";
  1468. case W3_ICON_UNDEAD:
  1469. return "undead";
  1470. case W3_ICON_RANDOM:
  1471. return "random";
  1472. case W3_ICON_DEMONS:
  1473. return "demons";
  1474. default:
  1475.     eventlog(eventlog_level_warn,"race_get_str","unknown race: %x", race);
  1476.     return NULL;
  1477. }
  1478. }
  1479. extern int account_set_racewin( t_account * account, unsigned int intrace, char const * clienttag)
  1480. {
  1481. char table[256];
  1482. unsigned int wins;
  1483. char const * race = race_get_str(intrace);
  1484. if(!race)
  1485.     return -1;
  1486. sprintf(table,"Record\%s\%s\wins",clienttag, race);
  1487. wins = account_get_numattr(account,table);
  1488. wins++;
  1489. return account_set_numattr(account,table,wins);
  1490. }
  1491. extern int account_get_racewin( t_account * account, unsigned int intrace, char const * clienttag)
  1492. {
  1493. char table[256];
  1494. char const *race = race_get_str(intrace);
  1495. if(!race)
  1496.     return 0;
  1497. sprintf(table,"Record\%s\%s\wins",clienttag, race);
  1498. return account_get_numattr(account,table);
  1499. }
  1500. extern int account_set_raceloss( t_account * account, unsigned int intrace, char const * clienttag)
  1501. {
  1502. char table[256];
  1503. unsigned int losses;
  1504. char const *race = race_get_str(intrace);
  1505. if(!race)
  1506.     return -1;
  1507. sprintf(table,"Record\%s\%s\losses",clienttag,race);
  1508. losses=account_get_numattr(account,table);
  1509. losses++;
  1510. return account_set_numattr(account,table,losses);
  1511. }
  1512. extern int account_get_raceloss( t_account * account, unsigned int intrace, char const * clienttag)
  1513. {
  1514. char table[256];
  1515. char const *race = race_get_str(intrace);
  1516. if(!race)
  1517.     return 0;
  1518. sprintf(table,"Record\%s\%s\losses",clienttag,race);
  1519. return account_get_numattr(account,table);
  1520. }
  1521. extern int account_set_solowin( t_account * account, char const * clienttag)
  1522. {
  1523.   char key[256];
  1524.   unsigned int win;
  1525.   sprintf(key,"Record\%s\solo\wins",clienttag);
  1526.   win = account_get_numattr(account,key);
  1527.   win++;
  1528.   return account_set_numattr(account,key,win);
  1529. }
  1530. extern int account_get_solowin( t_account * account, char const * clienttag )
  1531. {
  1532.   char key[256];
  1533.   sprintf(key,"Record\%s\solo\wins",clienttag);
  1534.   return account_get_numattr(account,key);
  1535. }
  1536. extern int account_set_sololoss( t_account * account, char const * clienttag)
  1537. {
  1538.   char key[256];
  1539.   unsigned int loss;
  1540.   sprintf(key,"Record\%s\solo\losses",clienttag);
  1541.   
  1542.   loss = account_get_numattr(account,key);
  1543.   loss++;
  1544.   return account_set_numattr(account,key,loss);
  1545. }
  1546. extern int account_get_sololoss( t_account * account, char const * clienttag)
  1547. {
  1548.   char key[256];
  1549.   sprintf(key,"Record\%s\solo\losses",clienttag);
  1550.   return account_get_numattr(account,key);
  1551. }
  1552. extern int account_set_soloxp(t_account * account, char const * clienttag, t_game_result gameresult, unsigned int opponlevel, int * xp_diff)
  1553.   char key[256];
  1554.   int xp;
  1555.   int mylevel;
  1556.   int xpdiff = 0, placeholder;
  1557.   
  1558.   xp = account_get_soloxp(account, clienttag); //get current xp
  1559.   if (xp < 0) {
  1560.     eventlog(eventlog_level_error, "account_set_soloxp", "got negative XP");
  1561.     return -1;
  1562.   }
  1563.    
  1564.   mylevel = account_get_sololevel(account,clienttag); //get accounts level
  1565.   if (mylevel > W3_XPCALC_MAXLEVEL) {
  1566.     eventlog(eventlog_level_error, "account_set_soloxp", "got invalid level: %d", mylevel);
  1567.     return -1;
  1568.   }
  1569.   
  1570.   if(mylevel<=0) //if level is 0 then set it to 1
  1571.     mylevel=1;
  1572.   
  1573.   if (opponlevel < 1) opponlevel = 1;
  1574.   
  1575.   switch (gameresult) 
  1576.     {
  1577.     case game_result_win:
  1578.       ladder_war3_xpdiff(mylevel, opponlevel, &xpdiff, &placeholder); break;
  1579.     case game_result_loss:
  1580.       ladder_war3_xpdiff(opponlevel, mylevel, &placeholder, &xpdiff); break;
  1581.     default:
  1582.       eventlog(eventlog_level_error, "account_set_soloxp", "got invalid game result: %d", gameresult);
  1583.       return -1;
  1584.     }
  1585.   *xp_diff = xpdiff;
  1586.   xp += xpdiff;
  1587.   if (xp < 0) xp = 0;
  1588.   sprintf(key,"Record\%s\solo\xp",clienttag);
  1589.   
  1590.   return account_set_numattr(account,key,xp);
  1591. }
  1592. extern int account_get_soloxp(t_account * account, char const * clienttag)
  1593. {
  1594.   char key[256];
  1595.   
  1596.   sprintf(key,"Record\%s\solo\xp",clienttag);
  1597.   
  1598.   return account_get_numattr(account,key);
  1599. }
  1600. extern int account_set_sololevel(t_account * account, char const * clienttag)
  1601.   char key[256];
  1602.   int xp, mylevel;
  1603.   
  1604.   xp = account_get_soloxp(account, clienttag);
  1605.   if (xp < 0) xp = 0;
  1606.    
  1607.   mylevel = account_get_sololevel(account,clienttag);
  1608.   if (mylevel < 1) mylevel = 1;
  1609.    
  1610.   if (mylevel > W3_XPCALC_MAXLEVEL) {
  1611.     eventlog(eventlog_level_error, "account_set_sololevel", "got invalid level: %d", mylevel);
  1612.     return -1;
  1613.   }
  1614.    
  1615.   mylevel = ladder_war3_updatelevel(mylevel, xp);
  1616.   sprintf(key,"Record\%s\solo\level",clienttag);
  1617.   return account_set_numattr(account, key, mylevel);
  1618. }
  1619. extern int account_get_sololevel(t_account * account, char const * clienttag)
  1620. {
  1621.   char key[256];
  1622.   
  1623.   sprintf(key,"Record\%s\solo\level",clienttag);
  1624.   return account_get_numattr(account,key);
  1625. }
  1626. extern int account_set_solorank(t_account * account, char const * clienttag, int rank)
  1627. {
  1628.   char key[256];
  1629.   sprintf(key,"Record\%s\solo\rank",clienttag);
  1630.   return account_set_numattr(account, key, rank);
  1631. }
  1632. extern int account_get_solorank(t_account * account, char const * clienttag)
  1633. {
  1634.   char key[256];
  1635.   sprintf(key,"Record\%s\solo\rank",clienttag);
  1636.   
  1637.   return account_get_numattr(account,key);
  1638. }
  1639. // Team Game - Play Game Funcs
  1640. extern int account_set_teamwin(t_account * account, char const * clienttag)
  1641. {
  1642.   char key[256];
  1643.   unsigned int win;
  1644.   sprintf(key,"Record\%s\team\wins",clienttag);
  1645.   
  1646.   win = account_get_numattr(account,key);
  1647.   win++;
  1648.   return account_set_numattr(account,key,win);
  1649. }
  1650. extern int account_get_teamwin(t_account * account, char const * clienttag)
  1651. {
  1652.   char key[256];
  1653.   
  1654.   sprintf(key,"Record\%s\team\wins",clienttag);
  1655.   
  1656.   return account_get_numattr(account,key);
  1657. }
  1658. extern int account_set_teamloss(t_account * account, char const * clienttag)
  1659. {
  1660.   char key[256];
  1661.   unsigned int loss;
  1662.   sprintf(key,"Record\%s\team\losses",clienttag);
  1663.   loss = account_get_numattr(account,key);
  1664.   loss++;
  1665.   return account_set_numattr(account,key,loss);
  1666. }
  1667. extern int account_get_teamloss(t_account * account, char const * clienttag)
  1668. {
  1669.   char key[256];
  1670.   sprintf(key,"Record\%s\team\losses",clienttag);
  1671.   return account_get_numattr(account,key);
  1672. }
  1673. extern int account_set_teamxp(t_account * account, char const * clienttag, t_game_result gameresult, unsigned int opponlevel,int * xp_diff)
  1674. {
  1675.   char key[256];
  1676.   int xp;
  1677.   int mylevel;
  1678.   int xpdiff = 0, placeholder;
  1679.   xp = account_get_teamxp(account,clienttag); //get current xp
  1680.   if (xp < 0) {
  1681.     eventlog(eventlog_level_error, "account_set_teamxp", "got negative XP");
  1682.     return -1;
  1683.   }
  1684.   mylevel = account_get_teamlevel(account,clienttag); //get accounts level
  1685.   if (mylevel > W3_XPCALC_MAXLEVEL) {
  1686.     eventlog(eventlog_level_error, "account_set_teamxp", "got invalid level: %d", mylevel);
  1687.     return -1;
  1688.   }
  1689.   if(mylevel<=0) //if level is 0 then set it to 1
  1690.     mylevel=1;
  1691.   
  1692.   if (opponlevel < 1) opponlevel = 1;
  1693.   
  1694.   switch (gameresult) 
  1695.     {
  1696.     case game_result_win:
  1697.       ladder_war3_xpdiff(mylevel, opponlevel, &xpdiff, &placeholder); break;
  1698.     case game_result_loss:
  1699.       ladder_war3_xpdiff(opponlevel, mylevel, &placeholder, &xpdiff); break;
  1700.     default:
  1701.       eventlog(eventlog_level_error, "account_set_teamxp", "got invalid game result: %d", gameresult);
  1702.       return -1;
  1703.     }  
  1704.   *xp_diff = xpdiff;
  1705.   xp += xpdiff;
  1706.   if(xp<0) xp=0;
  1707.   
  1708.   sprintf(key,"Record\%s\team\xp",clienttag);
  1709.   return account_set_numattr(account, key, xp);
  1710. }
  1711. extern int account_get_teamxp(t_account * account, char const * clienttag)
  1712. {
  1713.   char key[256];
  1714.   sprintf(key,"Record\%s\team\xp",clienttag);
  1715.   
  1716.   return account_get_numattr(account, key);
  1717. }
  1718. extern int account_set_teamlevel(t_account * account, char const * clienttag)
  1719.   char key[256];
  1720.   int xp,mylevel;
  1721.   
  1722.   xp = account_get_teamxp(account,clienttag);
  1723.   
  1724.   if (xp<0) xp =0;
  1725.   mylevel = account_get_teamlevel(account,clienttag);
  1726.   if (mylevel < 1) mylevel = 1;
  1727.   
  1728.   if (mylevel > W3_XPCALC_MAXLEVEL) 
  1729.     {
  1730.       eventlog(eventlog_level_error, "account_set_teamlevel", "got invalid level: %d", mylevel);
  1731.       return -1;
  1732.     }
  1733.   
  1734.   mylevel = ladder_war3_updatelevel(mylevel, xp);
  1735.   
  1736.   sprintf(key,"Record\%s\team\level",clienttag);
  1737.   return account_set_numattr(account, key, mylevel);
  1738. }
  1739. extern int account_get_teamlevel(t_account * account, char const * clienttag)
  1740. {
  1741.   char key[256];
  1742.   sprintf(key,"Record\%s\team\level",clienttag);
  1743.   
  1744.   return account_get_numattr(account, key);
  1745. }
  1746. extern int account_set_teamrank(t_account * account, char const * clienttag, int rank)
  1747. {
  1748.   char key[256];
  1749.   sprintf(key,"Record\%s\team\rank",clienttag);
  1750.   
  1751.   return account_set_numattr(account,key,rank);
  1752. }
  1753. extern int account_get_teamrank(t_account * account, char const * clienttag)
  1754. {
  1755.   char key[256];
  1756.   sprintf(key,"Record\%s\team\rank",clienttag);
  1757.   
  1758.   return account_get_numattr(account,key);
  1759. }
  1760. // FFA code
  1761. extern int account_set_ffawin(t_account * account, char const * clienttag)
  1762. {
  1763.   char key[256];
  1764.   unsigned int win;
  1765.   sprintf(key,"Record\%s\ffa\wins",clienttag);
  1766.   
  1767.   win = account_get_numattr(account,key);
  1768.   win++;
  1769.   return account_set_numattr(account,key,win);
  1770. }
  1771. extern int account_get_ffawin(t_account * account, char const * clienttag)
  1772. {
  1773.   char key[256];
  1774.   sprintf(key,"Record\%s\ffa\wins",clienttag);
  1775.   
  1776.   return account_get_numattr(account,key);
  1777. }
  1778. extern int account_set_ffaloss(t_account * account, char const * clienttag)
  1779. {
  1780.   char key[256];
  1781.   unsigned int loss;
  1782.   sprintf(key,"Record\%s\ffa\losses",clienttag);
  1783.   loss = account_get_numattr(account,key);
  1784.   loss++;
  1785.   return account_set_numattr(account,key,loss);
  1786. }
  1787. extern int account_get_ffaloss(t_account * account, char const * clienttag)
  1788. {
  1789.   char key[256];
  1790.   sprintf(key,"Record\%s\ffa\losses",clienttag);
  1791.   
  1792.   return account_get_numattr(account,key);
  1793. }
  1794. extern int account_set_ffaxp(t_account * account, char const * clienttag,t_game_result gameresult, unsigned int opponlevel, int * xp_diff)
  1795.   char key[256];
  1796.   int xp;
  1797.   int mylevel;
  1798.   int xpdiff = 0, placeholder;
  1799.   xp = account_get_ffaxp(account,clienttag); //get current xp
  1800.   xpdiff = 0;
  1801.   if (xp < 0) {
  1802.     eventlog(eventlog_level_error, "account_set_ffaxp", "got negative XP");
  1803.     return -1;
  1804.   }
  1805.   
  1806.   mylevel = account_get_ffalevel(account,clienttag); //get accounts level
  1807.   if (mylevel > W3_XPCALC_MAXLEVEL) {
  1808.     eventlog(eventlog_level_error, "account_set_ffaxp", "got invalid level: %d", mylevel);
  1809.     return -1;
  1810.   }
  1811.   if(mylevel<=0) //if level is 0 then set it to 1
  1812.     mylevel=1;
  1813.   
  1814.   if (opponlevel < 1) opponlevel = 1;
  1815.   switch (gameresult) 
  1816.     {
  1817.     case game_result_win:
  1818.       ladder_war3_xpdiff(mylevel, opponlevel, &xpdiff, &placeholder); break;
  1819.     case game_result_loss:
  1820.       ladder_war3_xpdiff(opponlevel, mylevel, &placeholder, &xpdiff); break;
  1821.     default:
  1822.       eventlog(eventlog_level_error, "account_set_ffaxp", "got invalid game result: %d", gameresult);
  1823.       return -1;
  1824.     }
  1825.     
  1826.   *xp_diff = xpdiff;
  1827.   xp += xpdiff;
  1828.   if (xp<0) xp=0;
  1829.   
  1830.   sprintf(key,"Record\%s\ffa\xp",clienttag);
  1831.   return account_set_numattr(account,key,xp);
  1832. }
  1833. extern int account_get_ffaxp(t_account * account, char const * clienttag)
  1834. {
  1835.   char key[256];
  1836.   sprintf(key,"Record\%s\ffa\xp",clienttag);
  1837.   return account_get_numattr(account,key);
  1838. }
  1839. extern int account_set_ffalevel(t_account * account, char const * clienttag)
  1840.   char key[256];
  1841.   int xp, mylevel;
  1842.   xp = account_get_ffaxp(account,clienttag);
  1843.   if (xp<0) xp = 0;
  1844.   mylevel = account_get_ffalevel(account,clienttag);
  1845.   if (mylevel < 1) mylevel = 1;
  1846.   
  1847.   if (mylevel > W3_XPCALC_MAXLEVEL) 
  1848.     {
  1849.       eventlog(eventlog_level_error, "account_set_ffalevel", "got invalid level: %d", mylevel);
  1850.       return -1;
  1851.     }
  1852.   
  1853.   mylevel = ladder_war3_updatelevel(mylevel, xp);
  1854.   
  1855.   sprintf(key,"Record\%s\ffa\level",clienttag);
  1856.   return account_set_numattr(account, key, mylevel);
  1857. }
  1858. extern int account_get_ffalevel(t_account * account, char const * clienttag)
  1859. {
  1860.   char key[256];
  1861.   sprintf(key,"Record\%s\ffa\level",clienttag);
  1862.   
  1863.   return account_get_numattr(account,key);
  1864. }
  1865. extern int account_get_ffarank(t_account * account, char const * clienttag)
  1866. {
  1867.   char key[256];
  1868.   sprintf(key,"Record\%s\ffa\rank",clienttag);
  1869.   return account_get_numattr(account,key);
  1870. }
  1871. // aaron --->
  1872. extern int account_set_ffarank(t_account * account, char const * clienttag, int rank)
  1873. {
  1874.   char key[256];
  1875.   sprintf(key,"Record\%s\ffa\rank",clienttag);
  1876.   return account_set_numattr(account,key,rank);
  1877. }
  1878. // <---
  1879. //Other funcs used in profiles and PG saving
  1880. extern void account_get_raceicon(t_account * account, char * raceicon, unsigned int * raceiconnumber, unsigned int * wins, char const * clienttag) //Based of wins for each race, Race with most wins, gets shown in chat channel
  1881. {
  1882. unsigned int humans;
  1883. unsigned int orcs;
  1884. unsigned int undead;
  1885. unsigned int nightelf;
  1886. unsigned int random;
  1887. int icons_limits[] = {25, 250, 500, 1500, -1};
  1888. unsigned int i;
  1889. random = account_get_racewin(account,W3_RACE_RANDOM,clienttag);
  1890. humans = account_get_racewin(account,W3_RACE_HUMANS,clienttag); 
  1891. orcs = account_get_racewin(account,W3_RACE_ORCS,clienttag); 
  1892. undead = account_get_racewin(account,W3_RACE_UNDEAD,clienttag);
  1893. nightelf = account_get_racewin(account,W3_RACE_NIGHTELVES,clienttag);
  1894. if(orcs>=humans && orcs>=undead && orcs>=nightelf && orcs>=random) {
  1895.   *raceicon = 'O';
  1896.   *wins = orcs;
  1897. }
  1898. else if(humans>=orcs && humans>=undead && humans>=nightelf && humans>=random) {
  1899.     *raceicon = 'H';
  1900.     *wins = humans;
  1901. }
  1902. else if(nightelf>=humans && nightelf>=orcs && nightelf>=undead && nightelf>=random) {
  1903.     *raceicon = 'N';
  1904.     *wins = nightelf;
  1905. }
  1906. else if(undead>=humans && undead>=orcs && undead>=nightelf && undead>=random) {
  1907.     *raceicon = 'U';
  1908.     *wins = undead;
  1909. }
  1910. else {
  1911.     *raceicon = 'R';
  1912.     *wins = random;
  1913. }
  1914. i = 0;
  1915. while((signed)*wins >= icons_limits[i] && icons_limits[i] > 0) i++;
  1916. *raceiconnumber = i + 1;
  1917. }
  1918. extern int account_get_profile_calcs(t_account * account, int xp, unsigned int Level)
  1919. {
  1920.         int xp_min;
  1921. int xp_max;
  1922. unsigned int i;
  1923. int  t;
  1924. unsigned int startlvl;
  1925. if (Level==1) startlvl = 1;
  1926. else startlvl = Level-1;
  1927. for (i = startlvl; i < W3_XPCALC_MAXLEVEL; i++) {
  1928. xp_min = ladder_war3_get_min_xp(i);
  1929. xp_max = ladder_war3_get_min_xp(i+1);
  1930. if ((xp >= xp_min) && (xp < xp_max)) {
  1931. t = (int)((((double)xp - (double)xp_min) 
  1932. / ((double)xp_max - (double)xp_min)) * 128);
  1933. if (i < Level) {
  1934. return 128 + t;
  1935. } else {
  1936. return t;
  1937. }
  1938. }
  1939. }
  1940. return 0;
  1941. }
  1942. extern int account_set_saveladderstats(t_account * account,unsigned int gametype, t_game_result result, unsigned int opponlevel, char const * clienttag)
  1943. {
  1944. unsigned int intrace;
  1945.         int xpdiff,uid,level;
  1946. if(!account) {
  1947. eventlog(eventlog_level_error, "account_set_saveladderstats", "got NULL account");
  1948. return -1;
  1949. }
  1950. //added for better tracking down of problems with gameresults
  1951. eventlog(eventlog_level_trace,__FUNCTION__,"parsing game result for player: %s result: %s",account_get_name(account),(result==game_result_win)?"WIN":"LOSS");
  1952. intrace = account_get_w3pgrace(account, clienttag);
  1953. uid = account_get_uid(account);
  1954. switch (gametype)
  1955. {
  1956.   case ANONGAME_TYPE_1V1: //1v1
  1957.   {
  1958. if(result == game_result_win) //win
  1959. {
  1960. account_set_solowin(account, clienttag);
  1961. account_set_racewin(account, intrace, clienttag);
  1962. }
  1963. if(result == game_result_loss) //loss
  1964. {
  1965. account_set_sololoss(account, clienttag);
  1966. account_set_raceloss(account,intrace, clienttag);
  1967. }
  1968. account_set_soloxp(account,clienttag,result,opponlevel,&xpdiff);
  1969. account_set_sololevel(account,clienttag);
  1970. level = account_get_sololevel(account,clienttag);
  1971. if (war3_ladder_update(solo_ladder(clienttag),uid,xpdiff,level,account,0)!=0)
  1972.   war3_ladder_add(solo_ladder(clienttag),uid,account_get_soloxp(account,clienttag),level,account,0,clienttag);
  1973. break;
  1974.   }
  1975.   case ANONGAME_TYPE_2V2:
  1976.   case ANONGAME_TYPE_3V3:
  1977.   case ANONGAME_TYPE_4V4:
  1978.   case ANONGAME_TYPE_5V5:
  1979.   case ANONGAME_TYPE_6V6:
  1980.   case ANONGAME_TYPE_2V2V2:
  1981.   case ANONGAME_TYPE_3V3V3:
  1982.   case ANONGAME_TYPE_4V4V4:
  1983.   case ANONGAME_TYPE_2V2V2V2:
  1984.   case ANONGAME_TYPE_3V3V3V3:
  1985.   {
  1986. if(result == game_result_win) //win
  1987. {
  1988. account_set_teamwin(account,clienttag);
  1989. account_set_racewin(account,intrace,clienttag);
  1990. }
  1991. if(result == game_result_loss) //loss
  1992. {
  1993. account_set_teamloss(account,clienttag);
  1994. account_set_raceloss(account,intrace,clienttag);
  1995. }
  1996. account_set_teamxp(account,clienttag,result,opponlevel,&xpdiff);
  1997. account_set_teamlevel(account,clienttag);
  1998. level = account_get_teamlevel(account,clienttag);
  1999. if (war3_ladder_update(team_ladder(clienttag),uid,xpdiff,level,account,0)!=0)
  2000.   war3_ladder_add(team_ladder(clienttag),uid,account_get_teamxp(account,clienttag),level,account,0,clienttag);
  2001. break;
  2002.   }
  2003.   case ANONGAME_TYPE_SMALL_FFA:
  2004.   {
  2005. if(result == game_result_win) //win
  2006. {
  2007. account_set_ffawin(account,clienttag);
  2008. account_set_racewin(account,intrace,clienttag);
  2009. }
  2010. if(result == game_result_loss) //loss
  2011. {
  2012. account_set_ffaloss(account,clienttag);
  2013. account_set_raceloss(account,intrace,clienttag);
  2014. }
  2015. account_set_ffaxp(account,clienttag,result,opponlevel,&xpdiff);
  2016. account_set_ffalevel(account,clienttag);
  2017. level = account_get_ffalevel(account,clienttag);
  2018. if (war3_ladder_update(ffa_ladder(clienttag),uid,xpdiff,level,account,0)!=0)
  2019.   war3_ladder_add(ffa_ladder(clienttag),uid,account_get_ffaxp(account,clienttag),level,account,0,clienttag);
  2020.                 break;
  2021.   }
  2022.   default:
  2023. eventlog(eventlog_level_error,"account_set_saveladderstats","Invalid Gametype? %u",gametype);
  2024. }
  2025. return 0;
  2026. }
  2027. extern int account_set_w3pgrace( t_account * account, char const * clienttag, unsigned int race)
  2028. {
  2029.   char key[256];
  2030.   sprintf(key,"Record\%s\w3pgrace",clienttag);
  2031.   return account_set_numattr( account, key, race);
  2032. }
  2033. extern int account_get_w3pgrace( t_account * account, char const * clienttag )
  2034. {
  2035.   char key[256];
  2036.   sprintf(key,"Record\%s\w3pgrace",clienttag);
  2037.   return account_get_numattr( account, key);
  2038. }
  2039. // Arranged Team Functions
  2040. extern int account_check_team(t_account * account, const char * members_usernames, char const * clienttag)
  2041. {
  2042.   int teams_cnt = account_get_atteamcount(account,clienttag);
  2043.   int i;
  2044.     
  2045.   if(teams_cnt==0) //user has never play at before
  2046.     return -1;
  2047.   for(i=1;i<=teams_cnt;i++)
  2048.     {
  2049.       char const * members = account_get_atteammembers(account,i,clienttag);
  2050.       if(members && members_usernames && strcasecmp(members,members_usernames)==0)
  2051. {
  2052.   eventlog(eventlog_level_debug,"account_check_team","Use have played before! Team num is %d",i);
  2053.   return i;
  2054. }
  2055.     }
  2056.   //if your here this group of people have never played a AT game yet
  2057.   return -1;
  2058. }
  2059. extern int account_create_newteam(t_account * account, const char * members_usernames, unsigned int teamsize, char const * clienttag)
  2060. {
  2061.     int teams_cnt = account_get_atteamcount(account,clienttag);
  2062.     if (teams_cnt <= 0 ) teams_cnt = 1;
  2063.     else teams_cnt++; /* since we making a new team here add+1 to the count */
  2064.     account_set_atteamcount(account,clienttag,teams_cnt);
  2065.     account_set_atteammembers(account,teams_cnt,clienttag,members_usernames);
  2066.     account_set_atteamsize(account,teams_cnt,clienttag,teamsize);
  2067.     return teams_cnt;
  2068. }
  2069. extern int account_set_atteamcount(t_account * account, char const * clienttag, unsigned int teamcount)
  2070. {
  2071.   char key[256];
  2072.   sprintf(key,"Record\%s\teamcount",clienttag);
  2073.   
  2074.   return account_set_numattr(account,key,teamcount);
  2075. }
  2076. extern int account_get_atteamcount(t_account * account, char const * clienttag)
  2077. {
  2078.   char key[256];
  2079.   sprintf(key,"Record\%s\teamcount",clienttag);
  2080.   return account_get_numattr(account,key);
  2081. }
  2082. extern int account_set_atteamsize(t_account * account, unsigned int teamcount, char const * clienttag, unsigned int teamsize)
  2083. {
  2084.   char key[356];
  2085.   
  2086.   sprintf(key,"Team\%s\%u\teamsize",clienttag,teamcount);
  2087.   
  2088.   return account_set_numattr(account,key,teamsize);
  2089. }
  2090. extern int account_get_atteamsize(t_account * account, unsigned int teamcount, char const * clienttag)
  2091. {
  2092.   char key[256];
  2093.   
  2094.   sprintf(key,"Team\%s\%u\teamsize",clienttag, teamcount);
  2095.   return account_get_numattr(account,key);
  2096. }
  2097. extern int account_set_atteamwin(t_account * account, unsigned int teamcount, char const * clienttag, int wins)
  2098. {
  2099.   char key[256];
  2100.   
  2101.   sprintf(key,"Team\%s\%u\teamwins",clienttag,teamcount);
  2102.   return account_set_numattr(account,key,wins);
  2103. }
  2104. extern int account_atteamwin(t_account * account, unsigned int teamcount, char const * clienttag)
  2105. {
  2106.   char key[256];
  2107.   int wins = account_get_atteamwin(account,teamcount,clienttag);
  2108.   wins++;
  2109.   
  2110.   sprintf(key,"Team\%s\%u\teamwins",clienttag,teamcount);
  2111.   return account_set_numattr(account,key,wins);
  2112. }
  2113. extern int account_get_atteamwin(t_account * account, unsigned int teamcount, char const * clienttag)
  2114. {
  2115.   char key[256];
  2116.   sprintf(key,"Team\%s\%u\teamwins",clienttag,teamcount);
  2117.   
  2118.   return account_get_numattr(account,key);
  2119. }
  2120. extern int account_set_atteamloss(t_account * account, unsigned int teamcount, char const * clienttag, int loss)
  2121. {
  2122.   char key[256];
  2123.   sprintf(key,"Team\%s\%u\teamlosses",clienttag,teamcount);
  2124.   return account_set_numattr(account,key,loss);
  2125. }
  2126. extern int account_atteamloss(t_account * account, unsigned int teamcount, char const * clienttag)
  2127. {
  2128.   char key[256];
  2129.   int loss = account_get_atteamloss(account,teamcount,clienttag);
  2130.   loss++;
  2131.   sprintf(key,"Team\%s\%u\teamlosses",clienttag,teamcount);
  2132.   return account_set_numattr(account,key,loss);
  2133. }
  2134. extern int account_get_atteamloss(t_account * account, unsigned int teamcount, char const * clienttag)
  2135. {
  2136.   char key[256];
  2137.   
  2138.   sprintf(key,"Team\%s\%u\teamlosses",clienttag,teamcount);
  2139.   return account_get_numattr(account,key);
  2140. }
  2141. extern int account_update_atteamxp(t_account * account, t_game_result gameresult, unsigned int opponlevel, unsigned int teamcount, char const * clienttag, int * xp_diff)
  2142.   int xp;
  2143.   int mylevel;
  2144.   int xpdiff = 0, placeholder;
  2145.   char key[256];
  2146.    
  2147.   xp = account_get_atteamxp(account,teamcount,clienttag); //get current xp
  2148.   if (xp < 0) {
  2149.     eventlog(eventlog_level_error, "account_set_atteamxp", "got negative XP");
  2150.     return -1;
  2151.   }
  2152.   
  2153.   mylevel = account_get_atteamlevel(account,teamcount,clienttag); //get accounts level
  2154.   if (mylevel > W3_XPCALC_MAXLEVEL) {
  2155.     eventlog(eventlog_level_error, "account_set_atteamxp", "got invalid level: %d", mylevel);
  2156.     return -1;
  2157.   }
  2158.   
  2159.   if(mylevel<=0) //if level is 0 then set it to 1
  2160.     mylevel=1;
  2161.   
  2162.   if (opponlevel < 1) opponlevel = 1;
  2163.   
  2164.   switch (gameresult) 
  2165.     {
  2166.     case game_result_win:
  2167.       ladder_war3_xpdiff(mylevel, opponlevel, &xpdiff, &placeholder); break;
  2168.     case game_result_loss:
  2169.       ladder_war3_xpdiff(opponlevel, mylevel, &placeholder, &xpdiff); break;
  2170.     default:
  2171.       eventlog(eventlog_level_error, "account_set_atteamxp", "got invalid game result: %d", gameresult);
  2172.       return -1;
  2173.     }
  2174.   
  2175.    *xp_diff = xpdiff;
  2176.    
  2177.    xp += xpdiff;
  2178.    if (xp < 0) xp = 0;
  2179.    
  2180.    sprintf(key,"Team\%s\%u\teamxp",clienttag,teamcount);
  2181.    return account_set_numattr(account,key,xp);
  2182. }
  2183. extern int account_get_atteamxp(t_account * account, unsigned int teamcount, char const * clienttag)
  2184. {
  2185.   char key[256];
  2186.   
  2187.   sprintf(key,"Team\%s\%u\teamxp",clienttag,teamcount);
  2188.   
  2189.   return account_get_numattr(account,key);
  2190. }
  2191. extern int account_set_atteamxp(t_account * account, unsigned int teamcount, char const * clienttag, int xp)
  2192. {
  2193.   char key[256];
  2194.   
  2195.   sprintf(key,"Team\%s\%u\teamxp",clienttag,teamcount);
  2196.   
  2197.   return account_set_numattr(account,key,xp);
  2198. }
  2199. extern int account_update_atteamlevel(t_account * account, unsigned int teamcount, char const * clienttag)
  2200. {
  2201.   int xp, mylevel;
  2202.   char key[256];
  2203.    
  2204.   xp = account_get_atteamxp(account,teamcount,clienttag);
  2205.    
  2206.   if (xp < 0) xp = 0;
  2207.    
  2208.   mylevel = account_get_atteamlevel(account,teamcount,clienttag);
  2209.   if (mylevel < 1) mylevel = 1;
  2210.   
  2211.   if (mylevel > W3_XPCALC_MAXLEVEL) 
  2212.     {
  2213.       eventlog(eventlog_level_error, "account_set_atteamlevel", "got invalid level: %d", mylevel);
  2214.       return -1;
  2215.     }
  2216.   
  2217.   mylevel = ladder_war3_updatelevel(mylevel, xp);
  2218.   sprintf(key,"Team\%s\%u\teamlevel",clienttag,teamcount);
  2219.   return account_set_numattr(account,key,mylevel);
  2220. }
  2221. extern int account_get_atteamlevel(t_account * account, unsigned int teamcount, char const * clienttag)
  2222. {
  2223.   char key[256];
  2224.   sprintf(key,"Team\%s\%u\teamlevel",clienttag, teamcount);
  2225.   return account_get_numattr(account,key);
  2226. }
  2227. extern int account_set_atteamlevel(t_account * account, unsigned int teamcount, char const * clienttag, int level)
  2228. {
  2229.   char key[256];
  2230.   sprintf(key,"Team\%s\%u\teamlevel",clienttag, teamcount);
  2231.   return account_set_numattr(account,key,level);
  2232. }
  2233. //aaron 
  2234. extern int account_get_atteamrank(t_account * account, unsigned int teamcount,char const * clienttag)
  2235. {
  2236.   char key[256];
  2237.   
  2238.   sprintf(key,"Team\%s\%u\rank",clienttag, teamcount);
  2239.   
  2240.   return account_get_numattr(account,key);
  2241. }
  2242. extern int account_set_atteamrank(t_account * account, unsigned int teamcount, char const * clienttag, int teamrank)
  2243. {
  2244.   char key[256];
  2245.   
  2246.   sprintf(key,"Team\%s\%u\rank",clienttag, teamcount);
  2247.   return account_set_numattr(account, key, teamrank);
  2248. }
  2249. // <---
  2250. extern int account_set_atteammembers(t_account * account, unsigned int teamcount, char const * clienttag, char const *members)
  2251. {
  2252.   char key[256];
  2253.   
  2254.   sprintf(key,"Team\%s\%u\teammembers",clienttag,teamcount);
  2255.   return account_set_strattr(account,key,members);
  2256. }
  2257. extern char const * account_get_atteammembers(t_account * account, unsigned int teamcount, char const * clienttag)
  2258. {
  2259.   char key[256];
  2260.   
  2261.   sprintf(key,"Team\%s\%u\teammembers",clienttag,teamcount);
  2262.   
  2263.   return account_get_strattr(account,key);
  2264. }
  2265. extern int account_set_currentatteam(t_account * account, unsigned int teamcount)
  2266. {
  2267. return account_set_numattr(account,"BNET\current_at_team",teamcount);
  2268. }
  2269. extern int account_get_currentatteam(t_account * account)
  2270. {
  2271. return account_get_numattr(account,"BNET\current_at_team");
  2272. }
  2273. extern int account_fix_at(t_account *account, const char * ctag)
  2274. {
  2275.     int n, i, j;
  2276.     int teamsize;
  2277.     const char *teammembers;
  2278.     if (account == NULL) {
  2279. eventlog(eventlog_level_error, __FUNCTION__, "got NULL account");
  2280. return -1;
  2281.     }
  2282.     if (ctag == NULL) {
  2283. eventlog(eventlog_level_error, __FUNCTION__, "got NULL clienttag");
  2284. return -1;
  2285.     }
  2286.     n = account_get_atteamcount(account, ctag);
  2287.     for(i = 1, j = 1; i <= n ; i++) {
  2288. teamsize = account_get_atteamsize(account, i, ctag);
  2289. teammembers = account_get_atteammembers(account, i, ctag);
  2290. if (!teammembers || teamsize < 1 || teamsize > 5) continue;
  2291. /* valid team */
  2292. if (j < i) {
  2293.     account_set_atteamsize(account, j, ctag, teamsize);
  2294.     account_set_atteammembers(account, j, ctag, teammembers);
  2295.     account_set_atteamwin(account, j, ctag, account_get_atteamwin(account, i, ctag));
  2296.     account_set_atteamloss(account, j, ctag, account_get_atteamloss(account, i, ctag));
  2297.     account_set_atteamxp(account, j, ctag, account_get_atteamxp(account, i, ctag));
  2298.     account_set_atteamrank(account, j, ctag, account_get_atteamrank(account, i, ctag));
  2299.     account_set_atteamlevel(account, j, ctag, account_get_atteamlevel(account, i, ctag));
  2300. }
  2301. j++;
  2302.     }
  2303.     if (j <= n) account_set_atteamcount(account, ctag, j - 1);
  2304.     return 0;
  2305. }
  2306. extern int account_set_saveATladderstats(t_account * account, unsigned int gametype, t_game_result result, unsigned int opponlevel, unsigned int current_teamnum, char const * clienttag)
  2307. {
  2308.   unsigned int intrace;
  2309.   int xpdiff,uid,level;
  2310.   if(!account) 
  2311.     {
  2312.       eventlog(eventlog_level_error, "account_set_saveATladderstats", "got NULL account");
  2313.       return -1;
  2314.     }
  2315.   
  2316.     //added for better tracking down of problems with gameresults
  2317.     eventlog(eventlog_level_trace,__FUNCTION__,"parsing game result for player: %s result: %s",account_get_name(account),(result==game_result_win)?"WIN":"LOSS");
  2318.   intrace = account_get_w3pgrace(account,clienttag);
  2319.   uid = account_get_uid(account);
  2320.   
  2321.   if(result == game_result_win)
  2322.     {
  2323.       account_atteamwin(account,current_teamnum,clienttag);
  2324.       account_set_racewin(account,intrace,clienttag);
  2325.     }
  2326.   if(result == game_result_loss)
  2327.     {
  2328.       account_atteamloss(account,current_teamnum,clienttag);
  2329.       account_set_raceloss(account,intrace,clienttag);
  2330.     }
  2331.   account_update_atteamxp(account,result,opponlevel,current_teamnum,clienttag,&xpdiff);
  2332.   account_update_atteamlevel(account,current_teamnum,clienttag);
  2333.   level = account_get_atteamlevel(account,current_teamnum,clienttag);
  2334.   if (war3_ladder_update(at_ladder(clienttag),uid,xpdiff,level,account,0)!=0)
  2335.     war3_ladder_add(at_ladder(clienttag),uid,account_get_atteamxp(account,current_teamnum,clienttag),level,account,0,clienttag);
  2336.   return 0;
  2337. }
  2338. extern int account_get_highestladderlevel(t_account * account,char const * clienttag)
  2339. {
  2340. // [quetzal] 20020827 - AT level part rewritten
  2341. int i;
  2342. unsigned int sololevel = account_get_sololevel(account,clienttag);
  2343. unsigned int teamlevel = account_get_teamlevel(account,clienttag);
  2344. unsigned int ffalevel  = account_get_ffalevel(account,clienttag);
  2345. unsigned int atlevel = 0;
  2346. unsigned int t; // [quetzal] 20020827 - not really needed, but could speed things up a bit
  2347. for (i = 0; i < account_get_atteamcount(account,clienttag); i++) {
  2348. if ((t = account_get_atteamlevel(account, i+1,clienttag)) > atlevel) {
  2349. atlevel = t;
  2350. }
  2351. }
  2352. eventlog(eventlog_level_debug,"account_get_highestladderlevel","Checking for highest level in Solo,Team,FFA,AT Ladder Stats");
  2353. eventlog(eventlog_level_debug,"account_get_highestladderlevel","Solo Level: %d, Team Level %d, FFA Level %d, Highest AT Team Level: %d",sololevel,teamlevel,ffalevel,atlevel);
  2354. if(sololevel >= teamlevel && sololevel >= atlevel && sololevel >= ffalevel)
  2355. return sololevel;
  2356. if(teamlevel >= sololevel && teamlevel >= atlevel && teamlevel >= ffalevel)
  2357.          return teamlevel;
  2358. if(atlevel >= sololevel && atlevel >= teamlevel && atlevel >= ffalevel)
  2359.          return atlevel;
  2360. return ffalevel;
  2361.     // we should never get here
  2362. return -1;
  2363. }
  2364. extern int account_set_new_at_team(t_account * account, unsigned int value)
  2365. {
  2366. if(!account)
  2367. {
  2368. eventlog(eventlog_level_error,"account_set_new_at_team","Unable to set account flag to TRUE");
  2369. return -1;
  2370. }
  2371. return account_set_numattr(account,"BNET\new_at_team_flag",value);
  2372. }
  2373. extern int account_get_new_at_team(t_account * account)
  2374. {
  2375. if(!account)
  2376. {
  2377. eventlog(eventlog_level_error,"account_get_new_at_team","Unable to set account flag to TRUE");
  2378. return -1;
  2379. }
  2380. return account_get_numattr(account,"BNET\new_at_team_flag");
  2381. }
  2382. //BlacKDicK 04/20/2003
  2383. extern int account_set_user_icon( t_account * account, char const * clienttag,char const * usericon)
  2384. {
  2385.   char key[256];
  2386.   sprintf(key,"Record\%s\userselected_icon",clienttag);
  2387.   if (usericon)
  2388.     return account_set_strattr(account,key,usericon);
  2389.   else
  2390.     return account_set_strattr(account,key,"NULL");
  2391. }
  2392. extern char const * account_get_user_icon( t_account * account, char const * clienttag )
  2393. {
  2394.   char key[256];
  2395.   char const * retval;
  2396.   sprintf(key,"Record\%s\userselected_icon",clienttag);
  2397.   retval = account_get_strattr(account,key);
  2398.   if ((retval) && ((strcmp(retval,"NULL")!=0)))
  2399.     return retval;
  2400.   else
  2401.     return NULL;
  2402. }
  2403. // Ramdom - Nothing, Grean Dragon Whelp, Azure Dragon (Blue Dragon), Red Dragon, Deathwing, Nothing
  2404. // Humans - Peasant, Footman, Knight, Archmage, Medivh, Nothing
  2405. // Orcs - Peon, Grunt, Tauren, Far Seer, Thrall, Nothing
  2406. // Undead - Acolyle, Ghoul, Abomination, Lich, Tichondrius, Nothing
  2407. // Night Elves - Wisp, Archer, Druid of the Claw, Priestess of the Moon, Furion Stormrage, Nothing
  2408. // Demons - Nothing, ???(wich unit is nfgn), Infernal, Doom Guard, Pit Lord/Manaroth, Archimonde
  2409. // ADDED TFT ICON BY DJP 07/16/2003
  2410. static char * profile_code[12][6] = {
  2411.     {NULL  , "ngrd", "nadr", "nrdr", "nbwm", NULL  },
  2412.     {"hpea", "hfoo", "hkni", "Hamg", "nmed", NULL  },
  2413.     {"opeo", "ogru", "otau", "Ofar", "Othr", NULL  },
  2414.     {"uaco", "ugho", "uabo", "Ulic", "Utic", NULL  },
  2415.     {"ewsp", "earc", "edoc", "Emoo", "Efur", NULL  },
  2416.     {NULL  , "nfng", "ninf", "nbal", "Nplh", "Uwar"}, /* not used by RoC */
  2417.     {NULL  , "nmyr", "nnsw", "nhyc", "Hvsh", "Eevm"},
  2418.     {"hpea", "hrif", "hsor", "hspt", "Hblm", "Hjai"},
  2419.     {"opeo", "ohun", "oshm", "ospw", "Oshd", "Orex"},
  2420.     {"uaco", "ucry", "uban", "uobs", "Ucrl", "Usyl"},
  2421.     {"ewsp", "esen", "edot", "edry", "Ekee", "Ewrd"},
  2422.     {NULL  , "nfgu", "ninf", "nbal", "Nplh", "Uwar"}
  2423. };
  2424. extern unsigned int account_get_icon_profile(t_account * account, char const * clienttag)
  2425. {
  2426. unsigned int humans = account_get_racewin(account,W3_RACE_HUMANS,clienttag); //  1;
  2427. unsigned int orcs = account_get_racewin(account,W3_RACE_ORCS,clienttag);          //  2;
  2428. unsigned int nightelf = account_get_racewin(account,W3_RACE_NIGHTELVES,clienttag);         //  4;
  2429. unsigned int undead = account_get_racewin(account,W3_RACE_UNDEAD,clienttag); //  8;
  2430. unsigned int random = account_get_racewin(account,W3_RACE_RANDOM,clienttag); // 32;
  2431. unsigned int race;       // 0 = Humans, 1 = Orcs, 2 = Night Elves, 3 = Undead, 4 = Ramdom
  2432. unsigned int level = 0; // 0 = under 25, 1 = 25 to 249, 2 = 250 to 499, 3 = 500 to 1499, 4 = 1500 or more (wins)
  2433. unsigned int wins;
  2434. int number_ctag = 0;
  2435. /* moved the check for orcs in the first place so people with 0 wins get peon */
  2436.         if(orcs>=humans && orcs>=undead && orcs>=nightelf && orcs>=random) {
  2437.             wins = orcs;
  2438.             race = 2;
  2439.         }
  2440.         else if(humans>=orcs && humans>=undead && humans>=nightelf && humans>=random) {
  2441.     wins = humans;
  2442.             race = 1;
  2443.         }
  2444.         else if(nightelf>=humans && nightelf>=orcs && nightelf>=undead && nightelf>=random) {
  2445.             wins = nightelf;
  2446.             race = 4;
  2447.         }
  2448.         else if(undead>=humans && undead>=orcs && undead>=nightelf && undead>=random) {
  2449.             wins = undead;
  2450.             race = 3;
  2451.         }
  2452.         else {
  2453.             wins = random;
  2454.             race = 0;
  2455.         }
  2456. if (strcmp(clienttag,CLIENTTAG_WARCRAFT3)==0) 
  2457. {
  2458.           while(wins >= anongame_infos_get_ICON_REQ_WAR3(level+1) && anongame_infos_get_ICON_REQ_WAR3(level+1) > 0) level++;
  2459. }
  2460. else
  2461. {
  2462.           while(wins >= anongame_infos_get_ICON_REQ_W3XP(level+1) && anongame_infos_get_ICON_REQ_W3XP(level+1) > 0) level++;
  2463.   number_ctag = 6;
  2464. }
  2465.         
  2466.         eventlog(eventlog_level_info,"account_get_icon_profile","race -> %u; level -> %u; wins -> %u; profileicon -> %s", race, level, wins, profile_code[race+number_ctag][level]);
  2467. return char_icon_to_uint(profile_code[race+number_ctag][level]);
  2468. }
  2469. extern unsigned int account_icon_to_profile_icon(char const * icon,t_account * account, char const * ctag)
  2470. {
  2471. char tmp_icon[4];
  2472. char * result;
  2473. int number_ctag=0;
  2474. if (icon==NULL) return account_get_icon_profile(account,ctag);
  2475. if (sizeof(icon)>=4){
  2476. strncpy(tmp_icon,icon,4);
  2477. tmp_icon[0]=tmp_icon[0]-48;
  2478. if (strcmp(ctag,CLIENTTAG_WAR3XP) == 0) {
  2479. number_ctag = 6;
  2480. }
  2481. if (tmp_icon[0]>=1) {
  2482. if (tmp_icon[1]=='R'){
  2483. result = profile_code[0+number_ctag][tmp_icon[0]-1];
  2484. }else if (tmp_icon[1]=='H'){
  2485. result = profile_code[1+number_ctag][tmp_icon[0]-1];
  2486. }else if (tmp_icon[1]=='O'){
  2487. result = profile_code[2+number_ctag][tmp_icon[0]-1];
  2488. }else if (tmp_icon[1]=='U'){
  2489. result = profile_code[3+number_ctag][tmp_icon[0]-1];
  2490. }else if (tmp_icon[1]=='N'){
  2491. result = profile_code[4+number_ctag][tmp_icon[0]-1];
  2492. }else if (tmp_icon[1]=='D'){
  2493. result = profile_code[5+number_ctag][tmp_icon[0]-1];
  2494. }else{
  2495. eventlog(eventlog_level_warn,"account_icon_to_profile_icon","got unrecognized race on [%s] icon ",icon);
  2496. result = profile_code[2][0];} /* "opeo" */
  2497. }else{
  2498. eventlog(eventlog_level_warn,"account_icon_to_profile_icon","got race_level<1 on [%s] icon ",icon);
  2499. result = NULL;
  2500. }
  2501. }else{
  2502.     eventlog(eventlog_level_error,"account_icon_to_profile_icon","got invalid icon lenght [%s] icon ",icon);
  2503.     result = NULL;
  2504. }
  2505. //eventlog(eventlog_level_debug,"account_icon_to_profile_icon","from [%4.4s] icon returned [0x%X]",icon,char_icon_to_uint(result));
  2506. return char_icon_to_uint(result);
  2507. }
  2508. extern int account_is_operator_or_admin(t_account * account, char const * channel)
  2509. {
  2510.    if ((account_get_auth_operator(account,channel)==1) || (account_get_auth_operator(account,NULL)==1) ||
  2511.        (account_get_auth_admin(account,channel)==1) || (account_get_auth_admin(account,NULL)==1) )
  2512.       return 1;
  2513.    else
  2514.       return 0;
  2515. }
  2516. static unsigned int char_icon_to_uint(char * icon)
  2517. {
  2518.     unsigned int value;
  2519.     
  2520.     if (!icon) return 0;
  2521.     if (strlen(icon)!=4) return 0;
  2522.     value  = ((unsigned int)icon[0])<<24;
  2523.     value |= ((unsigned int)icon[1])<<16;
  2524.     value |= ((unsigned int)icon[2])<< 8;
  2525.     value |= ((unsigned int)icon[3])    ;
  2526.     
  2527.     return value;
  2528. }
  2529. extern char const * account_get_email(t_account * account)
  2530. {
  2531. if(!account)
  2532. {
  2533. eventlog(eventlog_level_error,"account_get_new_at_team","Unable to set account flag to TRUE");
  2534. return NULL;
  2535. }
  2536.     return account_get_strattr(account,"BNET\acct\email");
  2537. }
  2538. extern int account_set_email(t_account * account, char const * email)
  2539. {
  2540. if(!account)
  2541. {
  2542. eventlog(eventlog_level_error,"account_get_new_at_team","Unable to set account flag to TRUE");
  2543. return -1;
  2544. }
  2545.     return account_set_strattr(account,"BNET\acct\email", email);
  2546. }