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

MySQL数据库

开发平台:

Visual C++

  1.     {
  2.       char const * tname;
  3.       
  4.       sprintf(msgtemp,"%-.20s has been squelched.",(tname = account_get_name(account)));
  5.       account_unget_name(tname);
  6.       message_send_text(c,message_type_info,c,msgtemp);
  7.     }
  8.   
  9.   return 0;
  10. }
  11. static int _handle_unsquelch_command(t_connection * c, char const *text)
  12. {
  13.   t_account const * account;
  14.   text = skip_command(text);
  15.   
  16.   /* D2 puts * before username - FIXME: the client don't see it until
  17.      the player rejoins the channel */
  18.   if (text[0]=='*')
  19.     text++;
  20.   
  21.   if (text[0]=='')
  22.     {
  23.       message_send_text(c,message_type_info,c,"usage: /unsquelch <username>");
  24.       return 0;
  25.     }
  26.   
  27.   if (!(account = accountlist_find_account(text)))
  28.     {
  29.       message_send_text(c,message_type_info,c,"No such user.");
  30.       return 0;
  31.     }
  32.   
  33.   if (conn_del_ignore(c,account)<0)
  34.     message_send_text(c,message_type_info,c,"User was not being ignored.");
  35.   else
  36.     message_send_text(c,message_type_info,c,"No longer ignoring.");
  37.   
  38.   return 0;
  39. }
  40. static int _handle_kick_command(t_connection * c, char const *text)
  41. {
  42.   char              dest[USER_NAME_MAX];
  43.   unsigned int      i,j;
  44.   t_channel const * channel;
  45.   t_connection *    kuc;
  46.   t_account *     acc;
  47.   
  48.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  49.   for (; text[i]==' '; i++);
  50.   for (j=0; text[i]!=' ' && text[i]!=''; i++) /* get dest */
  51.     if (j<sizeof(dest)-1) dest[j++] = text[i];
  52.   dest[j] = '';
  53.   for (; text[i]==' '; i++);
  54.   
  55.   if (dest[0]=='')
  56.     {
  57.       message_send_text(c,message_type_info,c,"usage: /kick <username>");
  58.       return 0;
  59.     }
  60.   
  61.   if (!(channel = conn_get_channel(c)))
  62.     {
  63.       message_send_text(c,message_type_error,c,"This command can only be used inside a channel.");
  64.       return 0;
  65.     }
  66.   acc = conn_get_account(c);
  67.   if (account_get_auth_admin(acc,NULL)!=1 && /* default to false */
  68.       account_get_auth_admin(acc,channel_get_name(channel))!=1 && /* default to false */
  69.       account_get_auth_operator(acc,NULL)!=1 && /* default to false */
  70.       account_get_auth_operator(acc,channel_get_name(channel))!=1 && /* default to false */
  71.       !channel_account_is_tmpOP(channel,acc))
  72.     {
  73.       message_send_text(c,message_type_error,c,"You have to be at least a Channel Operator or tempOP to use this command.");
  74.       return 0;
  75.     }
  76.   if (!(kuc = connlist_find_connection_by_accountname(dest)))
  77.     {
  78.       message_send_text(c,message_type_error,c,"That user is not logged in.");
  79.       return 0;
  80.     }
  81.   if (conn_get_channel(kuc)!=channel)
  82.     {
  83.       message_send_text(c,message_type_error,c,"That user is not in this channel.");
  84.       return 0;
  85.     }
  86.   if (account_get_auth_admin(conn_get_account(kuc),NULL)==1 ||
  87.     account_get_auth_admin(conn_get_account(kuc),channel_get_name(channel))==1)
  88.     {
  89.       message_send_text(c,message_type_error,c,"You cannot kick administrators.");
  90.       return 0;
  91.     }
  92.   else if (account_get_auth_operator(conn_get_account(kuc),NULL)==1 ||
  93.     account_get_auth_operator(conn_get_account(kuc),channel_get_name(channel))==1)
  94.     {
  95.       message_send_text(c,message_type_error,c,"You cannot kick operators.");
  96.       return 0;
  97.     }
  98.       
  99.   {
  100.     char const * tname1;
  101.     char const * tname2;
  102.     
  103.     tname1 = account_get_name(conn_get_account(kuc));
  104.     tname2 = account_get_name(conn_get_account(c));
  105.     if (text[i]!='')
  106.       sprintf(msgtemp,"%-.20s has been kicked by %-.20s (%s).",tname1,tname2?tname2:"unknown",&text[i]);
  107.     else
  108.       sprintf(msgtemp,"%-.20s has been kicked by %-.20s.",tname1,tname2?tname2:"unknown");
  109.     if (tname2)
  110.       account_unget_name(tname2);
  111.     if (tname1)
  112.       account_unget_name(tname1);
  113.     channel_message_send(channel,message_type_info,c,msgtemp);
  114.   }
  115.   conn_set_channel(kuc,CHANNEL_NAME_KICKED); /* should not fail */
  116.   
  117.   return 0;
  118. }
  119. static int _handle_ban_command(t_connection * c, char const *text)
  120. {
  121.   char           dest[USER_NAME_MAX];
  122.   unsigned int   i,j;
  123.   t_channel *    channel;
  124.   t_connection * buc;
  125.   
  126.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  127.   for (; text[i]==' '; i++);
  128.   for (j=0; text[i]!=' ' && text[i]!=''; i++) /* get dest */
  129.     if (j<sizeof(dest)-1) dest[j++] = text[i];
  130.   dest[j] = '';
  131.   for (; text[i]==' '; i++);
  132.   
  133.   if (dest[0]=='')
  134.     {
  135.       message_send_text(c,message_type_info,c,"usage. /ban <username>");
  136.       return 0;
  137.     }
  138.   
  139.   if (!(channel = conn_get_channel(c)))
  140.     {
  141.       message_send_text(c,message_type_error,c,"This command can only be used inside a channel.");
  142.       return 0;
  143.     }
  144.   if (account_get_auth_admin(conn_get_account(c),NULL)!=1 && /* default to false */
  145.       account_get_auth_admin(conn_get_account(c),channel_get_name(channel))!=1 && /* default to false */
  146.       account_get_auth_operator(conn_get_account(c),NULL)!=1 && /* default to false */
  147.       account_get_auth_operator(conn_get_account(c),channel_get_name(channel))!=1) /* default to false */
  148.     {
  149.       message_send_text(c,message_type_error,c,"You have to be at least a Channel Operator to use this command.");
  150.       return 0;
  151.     }
  152.   {
  153.     t_account * account;
  154.     
  155.     if (!(account = accountlist_find_account(dest)))
  156.       message_send_text(c,message_type_info,c,"That account doesn't currently exist, banning anyway.");
  157.     else if (account_get_auth_admin(account,NULL)==1 || account_get_auth_admin(account,channel_get_name(channel))==1)
  158.       {
  159.         message_send_text(c,message_type_error,c,"You cannot ban administrators.");
  160.         return 0;
  161.       }
  162.     else if (account_get_auth_operator(account,NULL)==1 ||
  163. account_get_auth_operator(account,channel_get_name(channel))==1)
  164.       {
  165.         message_send_text(c,message_type_error,c,"You cannot ban operators.");
  166.         return 0;
  167.       }
  168.   }
  169.   
  170.   if (channel_ban_user(channel,dest)<0)
  171.     {
  172.       sprintf(msgtemp,"Unable to ban %-.20s.",dest);
  173.       message_send_text(c,message_type_error,c,msgtemp);
  174.     }
  175.   else
  176.     {
  177.       char const * tname;
  178.       
  179.       tname = account_get_name(conn_get_account(c));
  180.       if (text[i]!='')
  181. sprintf(msgtemp,"%-.20s has been banned by %-.20s (%s).",dest,tname?tname:"unknown",&text[i]);
  182.       else
  183. sprintf(msgtemp,"%-.20s has been banned by %-.20s.",dest,tname?tname:"unknown");
  184.       if (tname)
  185. account_unget_name(tname);
  186.       channel_message_send(channel,message_type_info,c,msgtemp);
  187.     }
  188.   if ((buc = connlist_find_connection_by_accountname(dest)) &&
  189.       conn_get_channel(buc)==channel)
  190.     conn_set_channel(buc,CHANNEL_NAME_BANNED);
  191.   
  192.   return 0;
  193. }
  194. static int _handle_unban_command(t_connection * c, char const *text)
  195. {
  196.   t_channel *  channel;
  197.   unsigned int i;
  198.   
  199.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  200.   for (; text[i]==' '; i++);
  201.   
  202.   if (text[i]=='')
  203.     {
  204.       message_send_text(c,message_type_info,c,"usage: /unban <username>");
  205.       return 0;
  206.     }
  207.   
  208.   if (!(channel = conn_get_channel(c)))
  209.     {
  210.       message_send_text(c,message_type_error,c,"This command can only be used inside a channel.");
  211.       return 0;
  212.     }
  213.   if (account_get_auth_admin(conn_get_account(c),NULL)!=1 && /* default to false */
  214.       account_get_auth_admin(conn_get_account(c),channel_get_name(channel))!=1 && /* default to false */
  215.       account_get_auth_operator(conn_get_account(c),NULL)!=1 && /* default to false */
  216.       account_get_auth_operator(conn_get_account(c),channel_get_name(channel))!=1) /* default to false */
  217.     {
  218.       message_send_text(c,message_type_error,c,"You are not a channel operator.");
  219.       return 0;
  220.     }
  221.   
  222.   if (channel_unban_user(channel,&text[i])<0)
  223.     message_send_text(c,message_type_error,c,"That user is not banned.");
  224.   else
  225.     {
  226.       sprintf(msgtemp,"%s is no longer banned from this channel.",&text[i]);
  227.       message_send_text(c,message_type_info,c,msgtemp);
  228.     }
  229.   
  230.   return 0;
  231. }
  232. static int _handle_reply_command(t_connection * c, char const *text)
  233. {
  234.   unsigned int i;
  235.   char const * dest;
  236.   
  237.   if (!(dest = conn_get_lastsender(c)))
  238.     {
  239.       message_send_text(c,message_type_error,c,"No one messaged you, use /m instead");
  240.       return 0;
  241.     }
  242.   
  243.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  244.   for (; text[i]==' '; i++);
  245.   
  246.   if (text[i]=='')
  247.     {
  248.       message_send_text(c,message_type_info,c,"usage: /reply <replytext>");
  249.       return 0;
  250.     }
  251.   do_whisper(c,dest,&text[i]);
  252.   return 0;
  253. }
  254. static int _handle_realmann_command(t_connection * c, char const *text)
  255. {
  256.   unsigned int i;
  257.   char const * realmname;
  258.   char const * tname;
  259.   t_connection * tc;
  260.   t_elem const * curr;
  261.   t_message    * message;
  262.   
  263.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  264.   for (; text[i]==' '; i++);
  265.   
  266.   if (!(realmname=conn_get_realmname(c))) {
  267.     message_send_text(c,message_type_info,c,"You must join a realm first");
  268.     return 0;
  269.   }
  270.   if (text[i]=='')
  271.   {
  272.     message_send_text(c,message_type_info,c,"usage: /realmann <announcement text>");
  273.     return 0;
  274.   }
  275.   
  276.   sprintf(msgtemp,"Announcement from %.32s@%.32s: %.128s",(tname = conn_get_username(c)),realmname,&text[i]);
  277.   conn_unget_username(c,tname);
  278.   if (!(message = message_create(message_type_broadcast,c,NULL,msgtemp)))
  279.     {
  280.       message_send_text(c,message_type_info,c,"Could not broadcast message.");
  281.     }
  282.   else
  283.     {
  284.       LIST_TRAVERSE_CONST(connlist(),curr)
  285. {
  286.   tc = elem_get_data(curr);
  287.   if (!tc)
  288.     continue;
  289.   if ((conn_get_realmname(tc))&&(strcasecmp(conn_get_realmname(tc),realmname)==0))
  290.     {
  291.       message_send(message,tc);
  292.     }
  293. }
  294.     }
  295.   return 0;
  296. }
  297. static int _handle_watch_command(t_connection * c, char const *text)
  298. {
  299.   unsigned int i;
  300.   t_account *  account;
  301.   
  302.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  303.   for (; text[i]==' '; i++);
  304.   
  305.   if (text[i]=='')
  306.     {
  307.       message_send_text(c,message_type_info,c,"usage: /watch <username>");
  308.       return 0;
  309.     }
  310.   if (!(account = accountlist_find_account(&text[i])))
  311.     {
  312.       message_send_text(c,message_type_info,c,"That user does not exist.");
  313.       return 0;
  314.     }
  315.   
  316.   if (conn_add_watch(c,account,NULL)<0) /* FIXME: adds all events for now */
  317.     message_send_text(c,message_type_error,c,"Add to watch list failed.");
  318.   else
  319.     {
  320.       sprintf(msgtemp,"User %.64s added to your watch list.",&text[i]);
  321.       message_send_text(c,message_type_info,c,msgtemp);
  322.     }
  323.   
  324.   return 0;
  325. }
  326. static int _handle_unwatch_command(t_connection * c, char const *text)
  327.  {
  328.    unsigned int i;
  329.    t_account *  account;
  330.    
  331.    for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  332.    for (; text[i]==' '; i++);
  333.    
  334.    if (text[i]=='')
  335.      {
  336.        message_send_text(c,message_type_info,c,"usage: /unwatch <username>");
  337.        return 0;
  338.      }
  339.    if (!(account = accountlist_find_account(&text[i])))
  340.      {
  341.        message_send_text(c,message_type_info,c,"That user does not exist.");
  342.        return 0;
  343.      }
  344.    
  345.    if (conn_del_watch(c,account,NULL)<0) /* FIXME: deletes all events for now */
  346.      message_send_text(c,message_type_error,c,"Removal from watch list failed.");
  347.    else
  348.      {
  349.        sprintf(msgtemp,"User %.64s removed from your watch list.",&text[i]);
  350.        message_send_text(c,message_type_info,c,msgtemp);
  351.      }
  352.    
  353.    return 0;
  354.  }
  355. static int _handle_watchall_command(t_connection * c, char const *text)
  356. {
  357. char const * clienttag = NULL;
  358. text = skip_command(text);
  359. if(text[0] != '')
  360. clienttag = text;
  361.   if (conn_add_watch(c,NULL,clienttag)<0) /* FIXME: adds all events for now */
  362.     message_send_text(c,message_type_error,c,"Add to watch list failed.");
  363.   else
  364. if(clienttag)
  365. {
  366. char msgtemp[MAX_MESSAGE_LEN];
  367. sprintf(msgtemp, "All %s users added to your watch list.", clienttag);
  368.     message_send_text(c,message_type_info,c,msgtemp);
  369. }
  370. else
  371.     message_send_text(c,message_type_info,c,"All users added to your watch list.");
  372.   return 0;
  373. }
  374. static int _handle_unwatchall_command(t_connection * c, char const *text)
  375. {
  376. char const * clienttag = NULL;
  377. text = skip_command(text);
  378. if(text[0] != '')
  379. clienttag = text;
  380.   if (conn_del_watch(c,NULL,clienttag)<0) /* FIXME: deletes all events for now */
  381.     message_send_text(c,message_type_error,c,"Removal from watch list failed.");
  382.   else
  383. if(clienttag)
  384. {
  385. char msgtemp[MAX_MESSAGE_LEN];
  386. sprintf(msgtemp, "All %s users removed from your watch list.", clienttag);
  387.     message_send_text(c,message_type_info,c,msgtemp);
  388. }
  389. else
  390.     message_send_text(c,message_type_info,c,"All users removed from your watch list.");
  391.   return 0;
  392. }
  393. static int _handle_lusers_command(t_connection * c, char const *text)
  394. {
  395.   t_channel *    channel;
  396.   t_elem const * curr;
  397.   char const *   banned;
  398.   unsigned int   i;
  399.   
  400.   if (!(channel = conn_get_channel(c)))
  401.     {
  402.       message_send_text(c,message_type_error,c,"This command can only be used inside a channel.");
  403.       return 0;
  404.     }
  405.   
  406.   strcpy(msgtemp,"Banned users:");
  407.   i = strlen(msgtemp);
  408.   LIST_TRAVERSE_CONST(channel_get_banlist(channel),curr)
  409.     {
  410.       banned = elem_get_data(curr);
  411.       if (i+strlen(banned)+2>sizeof(msgtemp)) /* " ", name, '' */
  412. {
  413.   message_send_text(c,message_type_info,c,msgtemp);
  414.   i = 0;
  415. }
  416.       sprintf(&msgtemp[i]," %s",banned);
  417.       i += strlen(&msgtemp[i]);
  418.     }
  419.   if (i>0)
  420.     message_send_text(c,message_type_info,c,msgtemp);
  421.   
  422.   return 0;
  423. }
  424. static int _handle_news_command(t_connection * c, char const *text)
  425. {
  426.     if (newslist()) {
  427. t_news_index const  *newsindex;
  428. t_elem const  *curr;
  429. char date[64];
  430. char *body;
  431. struct tm  *temp;
  432. time_t temp1;
  433. char *temp2;
  434. int i,j;
  435. LIST_TRAVERSE_CONST(newslist(),curr)
  436. {
  437.     newsindex = elem_get_data(curr);
  438.     temp1 = news_get_date(newsindex);
  439.     temp = localtime(&temp1);
  440.     strftime(date, 64,"%B %d, %Y", temp);
  441.     message_send_text(c,message_type_info,c,date);
  442.     if ((body = news_get_body(newsindex)))
  443. {
  444.       for (i=0; body[i] != ''; i++) {
  445.   temp2 = strdup(&body[i]);
  446.   for (j=0; (temp2[j] != 'n')&&(temp2[j] != ''); j++);
  447.   temp2[j] = '';
  448.   message_send_text(c,message_type_info,c,temp2);
  449.   free((void *)temp2);
  450.   i = i+j;
  451.   }
  452.     }
  453. }
  454.     } else
  455. message_send_text(c,message_type_info,c,"No news today.");
  456.     return 0;
  457. }
  458. static int _handle_games_command(t_connection * c, char const *text)
  459. {
  460.   unsigned int   i;
  461.   t_elem const * curr;
  462.   t_game const * game;
  463.   char const *   tag;
  464.   
  465.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  466.   for (; text[i]==' '; i++);
  467.   
  468.   if (text[i]=='')
  469.     {
  470.       tag = conn_get_clienttag(c);
  471.       message_send_text(c,message_type_info,c,"Currently accessable games:");
  472.     }
  473.   else if (strcmp(&text[i],"all")==0)
  474.     {
  475.       tag = NULL;
  476.       message_send_text(c,message_type_info,c,"All current games:");
  477.     }
  478.   else
  479.     {
  480.       tag = &text[i];
  481.       sprintf(msgtemp,"Current games of type %s",tag);
  482.       message_send_text(c,message_type_info,c,msgtemp);
  483.     }
  484.   
  485.   if (prefs_get_hide_addr() && !(account_get_command_groups(conn_get_account(c)) & command_get_group("/admin-addr"))) /* default to false */
  486.     sprintf(msgtemp," ------name------ p -status- --------type--------- count");
  487.   else
  488.     sprintf(msgtemp," ------name------ p -status- --------type--------- count --------addr--------");
  489.   message_send_text(c,message_type_info,c,msgtemp);
  490.   LIST_TRAVERSE_CONST(gamelist(),curr)
  491.     {
  492.       game = elem_get_data(curr);
  493.       if ((!tag || !prefs_get_hide_pass_games() || game_get_flag(game) != game_flag_private) &&
  494.   (!tag || strcasecmp(game_get_clienttag(game),tag)==0))
  495. {
  496.   if (prefs_get_hide_addr() && !(account_get_command_groups(conn_get_account(c)) & command_get_group("/admin-addr"))) /* default to false */
  497.     sprintf(msgtemp," %-16.16s %1.1s %-8.8s %-21.21s %5u",
  498.     game_get_name(game),
  499.     game_get_flag(game) != game_flag_private ? "n":"y",
  500.     game_status_get_str(game_get_status(game)),
  501.     game_type_get_str(game_get_type(game)),
  502.     game_get_ref(game));
  503.   else
  504.     sprintf(msgtemp," %-16.16s %1.1s %-8.8s %-21.21s %5u %s",
  505.     game_get_name(game),
  506.     game_get_flag(game) != game_flag_private ? "n":"y",
  507.     game_status_get_str(game_get_status(game)),
  508.     game_type_get_str(game_get_type(game)),
  509.     game_get_ref(game),
  510.     addr_num_to_addr_str(game_get_addr(game),game_get_port(game)));
  511.   message_send_text(c,message_type_info,c,msgtemp);
  512. }
  513.     }
  514.   
  515.   return 0;
  516. }
  517. static int _handle_channels_command(t_connection * c, char const *text)
  518. {
  519.   unsigned int      i;
  520.   t_elem const *    curr;
  521.   t_channel const * channel;
  522.   char const *      tag;
  523.   t_connection const * conn;
  524.   t_account * acc;
  525.   char const * name;
  526.   int first;
  527.   
  528.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  529.   for (; text[i]==' '; i++);
  530.   
  531.   if (text[i]=='')
  532.     {
  533.       tag = conn_get_clienttag(c);
  534.       message_send_text(c,message_type_info,c,"Currently accessable channels:");
  535.     }
  536.   else if (strcmp(&text[i],"all")==0)
  537.     {
  538.       tag = NULL;
  539.       message_send_text(c,message_type_info,c,"All current channels:");
  540.     }
  541.   else
  542.     {
  543.       tag = &text[i];
  544.       sprintf(msgtemp,"Current channels of type %s",tag);
  545.       message_send_text(c,message_type_info,c,msgtemp);
  546.     }
  547.   
  548.   sprintf(msgtemp," -----------name----------- users ----admin/operator----");
  549.   message_send_text(c,message_type_info,c,msgtemp);
  550.   LIST_TRAVERSE_CONST(channellist(),curr)
  551.     {
  552.       channel = elem_get_data(curr);
  553.       if ((!(channel_get_flags(channel) & channel_flags_clan)) && (!tag || !prefs_get_hide_temp_channels() || channel_get_permanent(channel)) &&
  554.   (!tag || !channel_get_clienttag(channel) ||
  555.    strcasecmp(channel_get_clienttag(channel),tag)==0) &&
  556.    ((channel_get_max(channel)!=0) || //only show restricted channels to OPs and Admins
  557.     ((channel_get_max(channel)==0 && account_is_operator_or_admin(conn_get_account(c),NULL)))) &&
  558.     (!(channel_get_flags(channel) & channel_flags_thevoid)) // don't list TheVoid
  559. )
  560. {
  561.   sprintf(msgtemp," %-26.26s %5u - ",
  562.   channel_get_name(channel),
  563.   channel_get_length(channel));
  564.   first = 1;
  565.   for (conn = channel_get_first(channel);conn;conn=channel_get_next())
  566.   {
  567. acc = conn_get_account(conn);
  568. if (account_is_operator_or_admin(acc,channel_get_name(channel)) ||
  569.     channel_account_is_tmpOP(channel,acc))
  570. {
  571.   name = account_get_name(acc);
  572.   if (strlen(msgtemp) + strlen(name) +6 >= MAX_MESSAGE_LEN) break;
  573.   if (!first) strcat(msgtemp," ,");
  574.   strcat(msgtemp,name);
  575.   account_unget_name(name);
  576.   if (account_get_auth_admin(acc,NULL)==1) strcat(msgtemp,"(A)");
  577.   else if (account_get_auth_operator(acc,NULL)==1) strcat(msgtemp,"(O)");
  578.   else if (account_get_auth_admin(acc,channel_get_name(channel))==1) strcat(msgtemp,"(a)");
  579.   else if (account_get_auth_operator(acc,channel_get_name(channel))==1) strcat(msgtemp,"(o)");
  580.   first = 0;
  581. }
  582.   }
  583.   message_send_text(c,message_type_info,c,msgtemp);
  584. }
  585.     }
  586.   
  587.   return 0;
  588. }
  589. static int _handle_addacct_command(t_connection * c, char const *text)
  590. {
  591.   unsigned int i,j;
  592.   t_account  * temp;
  593.   t_hash       passhash;
  594.   char         username[USER_NAME_MAX];
  595.   char         pass[256];
  596.   
  597.   for (i=0; text[i]!=' ' && text[i]!=''; i++);
  598.   for (; text[i]==' '; i++);
  599.   
  600.   for (j=0; text[i]!=' ' && text[i]!=''; i++) /* get username */
  601.     if (j<sizeof(username)-1) username[j++] = text[i];
  602.   username[j] = '';
  603.   
  604.   for (; text[i]==' '; i++); /* skip spaces */
  605.   for (j=0; text[i]!=''; i++) /* get pass (spaces are allowed) */
  606.     if (j<sizeof(pass)-1) pass[j++] = text[i];
  607.   pass[j] = '';
  608.   
  609.   if (username[0]=='' || pass[0]=='')
  610.     {
  611.       message_send_text(c,message_type_info,c,"usage: /addacct <username> <password>");
  612.       return 0;
  613.     }
  614.   
  615.     if (account_check_name(username)<0)
  616.     { 
  617.         message_send_text(c,message_type_error,c,"Account name contains some invalid symbol!");
  618.         return 0; 
  619.     } 
  620.   /* FIXME: truncate or err on too long password */
  621.   for (i=0; i<strlen(pass); i++)
  622.     if (isupper((int)pass[i])) pass[i] = tolower((int)pass[i]);
  623.   
  624.   bnet_hash(&passhash,strlen(pass),pass);
  625.   
  626.   sprintf(msgtemp,"Trying to add account "%s" with password "%s"",username,pass);
  627.   message_send_text(c,message_type_info,c,msgtemp);
  628.   
  629.   sprintf(msgtemp,"Hash is: %s",hash_get_str(passhash));
  630.   message_send_text(c,message_type_info,c,msgtemp);
  631.   
  632.   if (!(temp = account_create(username,hash_get_str(passhash))))
  633.     {
  634.       message_send_text(c,message_type_error,c,"Failed to create account!");
  635.       eventlog(eventlog_level_info,"handle_command","[%d] account "%s" not created by admin (failed)",conn_get_socket(c),username);
  636.       return 0;
  637.     }
  638.   if (!accountlist_add_account(temp))
  639.     {
  640.       account_destroy(temp);
  641.       message_send_text(c,message_type_error,c,"Failed to insert account (already exists?)!");
  642.       eventlog(eventlog_level_info,"handle_command","[%d] account "%s" could not be created by admin (insert failed)",conn_get_socket(c),username);
  643.     }
  644.   else
  645.     {
  646.       sprintf(msgtemp,"Account "UID_FORMAT" created.",account_get_uid(temp));
  647.       message_send_text(c,message_type_info,c,msgtemp);
  648.       eventlog(eventlog_level_info,"handle_command","[%d] account "%s" created by admin",conn_get_socket(c),username);
  649.     }
  650.   return 0;
  651. }
  652. static int _handle_chpass_command(t_connection * c, char const *text)
  653. {
  654.   unsigned int i,j;
  655.   t_account  * account;
  656.   t_account  * temp;
  657.   t_hash       passhash;
  658.   char         arg1[256];
  659.   char         arg2[256];
  660.   char const * username;
  661.   char *       pass;
  662.   char const * channel;
  663.   
  664.   for (i=0; text[i]!=' ' && text[i]!=''; i++);
  665.   for (; text[i]==' '; i++);
  666.   
  667.   for (j=0; text[i]!=' ' && text[i]!=''; i++) /* get username/pass */
  668.     if (j<sizeof(arg1)-1) arg1[j++] = text[i];
  669.   arg1[j] = '';
  670.   
  671.   for (; text[i]==' '; i++); /* skip spaces */
  672.   for (j=0; text[i]!=''; i++) /* get pass (spaces are allowed) */
  673.     if (j<sizeof(arg2)-1) arg2[j++] = text[i];
  674.   arg2[j] = '';
  675.   
  676.   if (arg2[0]=='')
  677.     {
  678.       username = conn_get_username(c);
  679.       pass     = arg1;
  680.     }
  681.   else
  682.     {
  683.       username = arg1;
  684.       pass     = arg2;
  685.     }
  686.   
  687.   if (pass[0]=='')
  688.     {
  689.       message_send_text(c,message_type_info,c,"usage: /chpass [username] <password>");
  690.       return 0;
  691.     }
  692.   temp = accountlist_find_account(username);
  693.   account = conn_get_account(c);
  694.   
  695.   if ((temp==account && account_get_auth_changepass(account)==0) || /* default to true */
  696.       (temp!=account && !(account_get_command_groups(conn_get_account(c)) & command_get_group("/admin-chpass")))) /* default to false */
  697.     {
  698.       eventlog(eventlog_level_info,"handle_command","[%d] password change for "%s" refused (no change access)",conn_get_socket(c),username);
  699.       if (username!=arg1)
  700. conn_unget_username(c,username);
  701.       message_send_text(c,message_type_error,c,"Only admins may change passwords for other accounts.");
  702.       return 0;
  703.     }
  704.   if (!temp) 
  705.     {
  706.       message_send_text(c,message_type_error,c,"Account does not exist.");
  707.       if (username!=arg1)
  708.         conn_unget_username(c,username);
  709.       return 0;
  710.     }
  711.   
  712.   /* FIXME: truncate or err on too long password */
  713.   for (i=0; i<strlen(pass); i++)
  714.     if (isupper((int)pass[i])) pass[i] = tolower((int)pass[i]);
  715.   
  716.   bnet_hash(&passhash,strlen(pass),pass);
  717.   
  718.   sprintf(msgtemp,"Trying to change password for account "%s" to "%s"",username,pass);
  719.   message_send_text(c,message_type_info,c,msgtemp);
  720.   
  721.   if (username!=arg1)
  722.     conn_unget_username(c,username);
  723.   
  724.   if (account_set_pass(temp,hash_get_str(passhash))<0)
  725.     {
  726.       message_send_text(c,message_type_error,c,"Unable to set password.");
  727.       return 0;
  728.     }
  729.   
  730.   channel = channel_get_name(conn_get_channel(c));
  731.   if (account_get_auth_admin(account,channel) == 1 ||
  732.       account_get_auth_admin(account,NULL) == 1 || 
  733.       account_get_auth_operator(account,channel) == 1 ||
  734.       account_get_auth_operator(account,NULL) == 1) {
  735.     sprintf(msgtemp,
  736.       "Password for account "UID_FORMAT" updated.",account_get_uid(temp));
  737.     message_send_text(c,message_type_info,c,msgtemp);
  738.     sprintf(msgtemp,"Hash is: %s",hash_get_str(passhash));
  739.     message_send_text(c,message_type_info,c,msgtemp);
  740.   } else { 
  741.     sprintf(msgtemp,
  742.       "Password for account %s updated.",username);
  743.     message_send_text(c,message_type_info,c,msgtemp);
  744.   }
  745.   
  746.   return 0;
  747. }
  748. static int _handle_connections_command(t_connection *c, char const *text)
  749. {
  750.   t_elem const * curr;
  751.   t_connection * conn;
  752.   char           name[19];
  753.   unsigned int   i; /* for loop */
  754.   char const *   channel_name;
  755.   char const *   game_name;
  756.   
  757.   if (!prefs_get_enable_conn_all() && !(account_get_command_groups(conn_get_account(c)) & command_get_group("/admin-con"))) /* default to false */
  758.     {
  759.       message_send_text(c,message_type_error,c,"This command is only enabled for admins.");
  760.       return 0;
  761.     }
  762.   
  763.   message_send_text(c,message_type_info,c,"Current connections:");
  764.   /* addon */
  765.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  766.   for (; text[i]==' '; i++); 
  767.   
  768.   if (text[i]=='')
  769.     {
  770.       sprintf(msgtemp," -class -tag -----name------ -lat(ms)- ----channel---- --game--");
  771.       message_send_text(c,message_type_info,c,msgtemp);
  772.     }
  773.   else
  774.     if (strcmp(&text[i],"all")==0) /* print extended info */
  775.       {
  776. if (prefs_get_hide_addr() && !(account_get_command_groups(conn_get_account(c)) & command_get_group("/admin-addr")))
  777.   sprintf(msgtemp," -#- -class ----state--- -tag -----name------ -session-- -flag- -lat(ms)- ----channel---- --game--");
  778. else
  779.   sprintf(msgtemp," -#- -class ----state--- -tag -----name------ -session-- -flag- -lat(ms)- ----channel---- --game-- ---------addr--------");
  780. message_send_text(c,message_type_info,c,msgtemp);
  781.       }
  782.     else
  783.       {
  784. message_send_text(c,message_type_error,c,"Unknown option.");
  785. return 0;
  786.   }
  787.   
  788.   LIST_TRAVERSE_CONST(connlist(),curr)
  789.   {
  790.       conn = elem_get_data(curr);
  791.       if (conn_get_account(conn))
  792.   {
  793.   char const * tname;
  794.   
  795.   sprintf(name,""%.16s"",(tname = conn_get_username(conn)));
  796.   conn_unget_username(conn,tname);
  797. }
  798.       else
  799. strcpy(name,"(none)");
  800.       
  801.       if (conn_get_channel(conn)!=NULL)
  802. channel_name = channel_get_name(conn_get_channel(conn));
  803.       else channel_name = "none";
  804.       if (conn_get_game(conn)!=NULL)
  805. game_name = game_get_name(conn_get_game(conn));
  806.       else game_name = "none";
  807.       
  808.       if (text[i]=='')
  809. sprintf(msgtemp," %-6.6s %4.4s %-15.15s %9u %-16.16s %-8.8s",
  810. conn_class_get_str(conn_get_class(conn)),
  811. conn_get_fake_clienttag(conn),
  812. name, 
  813. conn_get_latency(conn), 
  814. channel_name,
  815. game_name);
  816.       else
  817. if (prefs_get_hide_addr() && !(account_get_command_groups(conn_get_account(c)) & command_get_group("/admin-addr"))) /* default to false */
  818.   sprintf(msgtemp," %3d %-6.6s %-12.12s %4.4s %-15.15s 0x%08x 0x%04x %9u %-16.16s %-8.8s", 
  819.   conn_get_socket(conn),
  820.   conn_class_get_str(conn_get_class(conn)), 
  821.   conn_state_get_str(conn_get_state(conn)),
  822.   conn_get_fake_clienttag(conn),
  823.   name,
  824.   conn_get_sessionkey(conn),
  825.   conn_get_flags(conn),
  826.   conn_get_latency(conn),
  827.   channel_name,
  828.   game_name);
  829. else
  830.   sprintf(msgtemp," %3u %-6.6s %-12.12s %4.4s %-15.15s 0x%08x 0x%04x %9u %-16.16s %-8.8s %s",
  831.   conn_get_socket(conn),
  832.   conn_class_get_str(conn_get_class(conn)),
  833.   conn_state_get_str(conn_get_state(conn)),
  834.   conn_get_fake_clienttag(conn),
  835.   name,
  836.   conn_get_sessionkey(conn),
  837.   conn_get_flags(conn),
  838.   conn_get_latency(conn),
  839.   channel_name,
  840.   game_name,
  841.   addr_num_to_addr_str(conn_get_addr(conn),conn_get_port(conn)));
  842.       
  843.       message_send_text(c,message_type_info,c,msgtemp);
  844.     }
  845.   
  846.   return 0;
  847. }
  848. static int _handle_finger_command(t_connection * c, char const *text)
  849. {
  850.   char           dest[USER_NAME_MAX];
  851.   unsigned int   i,j;
  852.   t_account *    account;
  853.   t_connection * conn;
  854.   char const *   ip;
  855.   char *         tok;
  856.   char const *   tname;
  857.   char const *   tsex;
  858.   char const *   tloc;
  859.   char const *   tage;
  860.   char const *   tip;
  861.   char const *   tdesc;
  862.   
  863.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  864.   for (; text[i]==' '; i++);
  865.   for (j=0; text[i]!=' ' && text[i]!=''; i++) /* get dest */
  866.     if (j<sizeof(dest)-1) dest[j++] = text[i];
  867.   dest[j] = '';
  868.   for (; text[i]==' '; i++);
  869.   if (dest[0]=='')
  870.   {
  871.     message_send_text(c,message_type_info,c,"usage: /finger <account>");
  872.     return 0;
  873.   }
  874.   
  875.   if (!(account = accountlist_find_account(dest)))
  876.     {
  877.       message_send_text(c,message_type_error,c,"Invalid user.");
  878.       return 0;
  879.     }
  880.   sprintf(msgtemp,"Login: %-16.16s "UID_FORMAT" Sex: %.14s",
  881.   (tname = account_get_name(account)),
  882.   account_get_uid(account),
  883.   (tsex = account_get_sex(account)));
  884.   account_unget_name(tname);
  885.   account_unget_sex(tsex);
  886.   message_send_text(c,message_type_info,c,msgtemp);
  887.   
  888.   sprintf(msgtemp,"Location: %-23.23s Age: %.14s",
  889.   (tloc = account_get_loc(account)),
  890.   (tage = account_get_age(account)));
  891.   account_unget_loc(tloc);
  892.   account_unget_age(tage);
  893.   message_send_text(c,message_type_info,c,msgtemp);
  894.   
  895.   if (!(ip=tip = account_get_ll_ip(account)) ||
  896.       !(account_get_command_groups(conn_get_account(c)) & command_get_group("/admin-addr"))) /* default to false */
  897.     ip = "unknown";
  898.   
  899.   {
  900.     time_t      then;
  901.     struct tm * tmthen;
  902.     
  903.     then = account_get_ll_time(account);
  904.     tmthen = localtime(&then); /* FIXME: determine user's timezone */
  905.     if (!(conn = connlist_find_connection_by_accountname(dest)))
  906.       if (tmthen)
  907. strftime(msgtemp,sizeof(msgtemp),"Last login %a %b %d %H:%M %Y from ",tmthen);
  908.       else
  909. strcpy(msgtemp,"Last login ? from ");
  910.     else
  911.       if (tmthen)
  912. strftime(msgtemp,sizeof(msgtemp),"On since %a %b %d %H:%M %Y from ",tmthen);
  913.       else
  914. strcpy(msgtemp,"On since ? from ");
  915.   }
  916.   strncat(msgtemp,ip,32);
  917.   if (tip)
  918.     account_unget_ll_ip(tip);
  919.   
  920.   message_send_text(c,message_type_info,c,msgtemp);
  921.   
  922.   if (conn)
  923.     {
  924.       sprintf(msgtemp,"Idle %s",seconds_to_timestr(conn_get_idletime(conn)));
  925.       message_send_text(c,message_type_info,c,msgtemp);
  926.     }
  927.   
  928.   strncpy(msgtemp,(tdesc = account_get_desc(account)),sizeof(msgtemp));
  929.   msgtemp[sizeof(msgtemp)-1] = '';
  930.   account_unget_desc(tdesc);
  931.   for (tok=strtok(msgtemp,"rn"); tok; tok=strtok(NULL,"rn"))
  932.     message_send_text(c,message_type_info,c,tok);
  933.   message_send_text(c,message_type_info,c,"");
  934.   
  935.   return 0;
  936. }
  937. /*
  938.  * rewrote command /operator to add and remove operator status [Omega]
  939.  *
  940.  * Fixme: rewrite /operators to show Currently logged on Server and/or Channel operators ...??
  941.  */
  942. /*
  943. static int _handle_operator_command(t_connection * c, char const *text)
  944. {
  945.   t_connection const * opr;
  946.   t_channel const *    channel;
  947.   
  948.   if (!(channel = conn_get_channel(c)))
  949.     {
  950.       message_send_text(c,message_type_error,c,"This command can only be used inside a channel.");
  951.       return 0;
  952.     }
  953.   
  954.   if (!(opr = channel_get_operator(channel)))
  955.     strcpy(msgtemp,"There is no operator.");
  956.   else
  957.     {
  958.       char const * tname;
  959.       
  960.       sprintf(msgtemp,"%.64s is the operator.",(tname = conn_get_username(opr)));
  961.       conn_unget_username(opr,tname);
  962.     }
  963.   message_send_text(c,message_type_info,c,msgtemp);
  964.   return 0;
  965. }
  966. */
  967. /* FIXME: do we want to show just Server Admin or Channel Admin Also? [Omega] */
  968. static int _handle_admins_command(t_connection * c, char const *text)
  969. {
  970.   unsigned int    i;
  971.   t_elem const *  curr;
  972.   t_connection *  tc;
  973.   char const *    nick;
  974.   
  975.   strcpy(msgtemp,"Currently logged on Administrators:");
  976.   i = strlen(msgtemp);
  977.   LIST_TRAVERSE_CONST(connlist(),curr)
  978.     {
  979.       tc = elem_get_data(curr);
  980.       if (!tc)
  981. continue;
  982.       if (account_get_auth_admin(conn_get_account(tc),NULL)==1)
  983. {
  984.   if ((nick = conn_get_username(tc)))
  985.     {
  986.       if (i+strlen(nick)+2>sizeof(msgtemp)) /* " ", name, '' */
  987. {
  988.   message_send_text(c,message_type_info,c,msgtemp);
  989.   i = 0;
  990. }
  991.       sprintf(&msgtemp[i]," %s", nick);
  992.       i += strlen(&msgtemp[i]);
  993.       conn_unget_username(tc,nick);
  994.     }
  995. }
  996.     }
  997.   if (i>0)
  998.     message_send_text(c,message_type_info,c,msgtemp);
  999.   
  1000.   return 0;
  1001. }
  1002. static int _handle_quit_command(t_connection * c, char const *text)
  1003. {
  1004.   message_send_text(c,message_type_info,c,"Connection closed.");
  1005.   conn_set_state(c,conn_state_destroy);
  1006.   return 0;
  1007. }
  1008. static int _handle_kill_command(t_connection * c, char const *text)
  1009. {
  1010.   unsigned int i,j;
  1011.   t_connection * user;
  1012.   char usrnick[USER_NAME_MAX]; /* max length of nick +  */  /* FIXME: Is it somewhere defined? */
  1013.   
  1014.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  1015.   for (; text[i]==' '; i++);
  1016.   for (j=0; text[i]!=' ' && text[i]!=''; i++) /* get nick */
  1017.     if (j<sizeof(usrnick)-1) usrnick[j++] = text[i];
  1018.   usrnick[j]='';
  1019.   for (; text[i]==' '; i++);
  1020.   
  1021.   if (usrnick[0]=='' || (usrnick[0]=='#' && (usrnick[1] < '0' || usrnick[1] > '9')))
  1022.     {
  1023.       message_send_text(c,message_type_info,c,"usage: /kill {<username>|#<socket>} [<min>]");
  1024.       return 0;
  1025.     }
  1026.   if (usrnick[0] == '#') {
  1027.      if (!(user = connlist_find_connection_by_socket(atoi(usrnick + 1)))) {
  1028.         message_send_text(c,message_type_error,c,"That connection doesnt exist.");
  1029.         return 0;
  1030.      }
  1031.   } else {
  1032.      if (!(user = connlist_find_connection_by_accountname(usrnick))) {
  1033.         message_send_text(c,message_type_error,c,"That user is not logged in?");
  1034.         return 0;
  1035.      }
  1036.   }
  1037.   if (text[i]!='' && ipbanlist_add(c,addr_num_to_ip_str(conn_get_addr(user)),ipbanlist_str_to_time_t(c,&text[i]))==0)
  1038.     {
  1039.       ipbanlist_save(prefs_get_ipbanfile());
  1040.       message_send_text(user,message_type_info,user,"Connection closed by admin and banned your ip.");
  1041.     }
  1042.   else
  1043.     message_send_text(user,message_type_info,user,"Connection closed by admin.");
  1044.   conn_set_state(user,conn_state_destroy);
  1045.   return 0;
  1046. }
  1047. static int _handle_killsession_command(t_connection * c, char const *text)
  1048. {
  1049.   unsigned int i,j;
  1050.   t_connection * user;
  1051.   char session[16];
  1052.   
  1053.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  1054.   for (; text[i]==' '; i++);
  1055.   for (j=0; text[i]!=' ' && text[i]!=''; i++) /* get nick */
  1056.     if (j<sizeof(session)-1) session[j++] = text[i];
  1057.   session[j]='';
  1058.   for (; text[i]==' '; i++);
  1059.   
  1060.   if (session[0]=='')
  1061.     {
  1062.       message_send_text(c,message_type_info,c,"usage: /killsession <session> [min]");
  1063.       return 0;
  1064.     }
  1065.   if (!isxdigit((int)session[0]))
  1066.     {
  1067.       message_send_text(c,message_type_error,c,"That is not a valid session.");
  1068.       return 0;
  1069.     }
  1070.   if (!(user = connlist_find_connection_by_sessionkey((unsigned int)strtoul(session,NULL,16))))
  1071.     {
  1072.       message_send_text(c,message_type_error,c,"That session does not exist.");
  1073.       return 0;
  1074.     }
  1075.   if (text[i]!='' && ipbanlist_add(c,addr_num_to_ip_str(conn_get_addr(user)),ipbanlist_str_to_time_t(c,&text[i]))==0)
  1076.     {
  1077.       ipbanlist_save(prefs_get_ipbanfile());
  1078.       message_send_text(user,message_type_info,user,"Connection closed by admin and banned your ip's.");
  1079.     }
  1080.   else
  1081.     message_send_text(user,message_type_info,user,"Connection closed by admin.");
  1082.   conn_set_state(user,conn_state_destroy);
  1083.   return 0;
  1084. }
  1085. static int _handle_gameinfo_command(t_connection * c, char const *text)
  1086. {
  1087.   unsigned int   i;
  1088.   t_game const * game;
  1089.   
  1090.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  1091.   for (; text[i]==' '; i++);
  1092.   
  1093.   if (text[i]=='')
  1094.     {
  1095.       if (!(game = conn_get_game(c)))
  1096. {
  1097.   message_send_text(c,message_type_error,c,"You are not in a game.");
  1098.   return 0;
  1099. }
  1100.     }
  1101.   else
  1102.     if (!(game = gamelist_find_game(&text[i],game_type_all)))
  1103.       {
  1104. message_send_text(c,message_type_error,c,"That game does not exist.");
  1105. return 0;
  1106.       }
  1107.   
  1108.   sprintf(msgtemp,"Name: %-20.20s    ID: "GAMEID_FORMAT" (%s)",game_get_name(game),game_get_id(game),game_get_flag(game) != game_flag_private ? "public":"private");
  1109.   message_send_text(c,message_type_info,c,msgtemp);
  1110.   
  1111.   {
  1112.     t_account *  owner;
  1113.     char const * tname;
  1114.     char const * namestr;
  1115.     
  1116.     if (!(owner = conn_get_account(game_get_owner(game))))
  1117.       {
  1118. tname = NULL;
  1119. namestr = "none";
  1120.       }
  1121.     else
  1122.       if (!(tname = account_get_name(owner)))
  1123. namestr = "unknown";
  1124.       else
  1125. namestr = tname;
  1126.     
  1127.     sprintf(msgtemp,"Owner: %-20.20s",namestr);
  1128.     
  1129.     if (tname)
  1130.       account_unget_name(tname);
  1131.   }
  1132.   message_send_text(c,message_type_info,c,msgtemp);
  1133.   
  1134.   if (!prefs_get_hide_addr() || (account_get_command_groups(conn_get_account(c)) & command_get_group("/admin-addr"))) /* default to false */
  1135.     {
  1136.       unsigned int   addr;
  1137.       unsigned short port;
  1138.       unsigned int   taddr;
  1139.       unsigned short tport;
  1140.       
  1141.       taddr=addr = game_get_addr(game);
  1142.       tport=port = game_get_port(game);
  1143.       gametrans_net(conn_get_addr(c),conn_get_port(c),conn_get_local_addr(c),conn_get_local_port(c),&taddr,&tport);
  1144.       
  1145.       if (taddr==addr && tport==port)
  1146. sprintf(msgtemp,"Address: %s",
  1147. addr_num_to_addr_str(addr,port));
  1148.       else
  1149. sprintf(msgtemp,"Address: %s (trans %s)",
  1150. addr_num_to_addr_str(addr,port),
  1151. addr_num_to_addr_str(taddr,tport));
  1152.       message_send_text(c,message_type_info,c,msgtemp);
  1153.     }
  1154.   
  1155.   sprintf(msgtemp,"Client: %4s (version %s, startver %u)",game_get_clienttag(game),vernum_to_verstr(game_get_version(game)),game_get_startver(game));
  1156.   message_send_text(c,message_type_info,c,msgtemp);
  1157.   
  1158.   {
  1159.     time_t      gametime;
  1160.     struct tm * gmgametime;
  1161.     
  1162.     gametime = game_get_create_time(game);
  1163.     if (!(gmgametime = localtime(&gametime)))
  1164.       strcpy(msgtemp,"Created: ?");
  1165.     else
  1166.       strftime(msgtemp,sizeof(msgtemp),"Created: "GAME_TIME_FORMAT,gmgametime);
  1167.     message_send_text(c,message_type_info,c,msgtemp);
  1168.     
  1169.     gametime = game_get_start_time(game);
  1170.     if (gametime!=(time_t)0)
  1171.       {
  1172. if (!(gmgametime = localtime(&gametime)))
  1173.   strcpy(msgtemp,"Started: ?");
  1174. else
  1175.   strftime(msgtemp,sizeof(msgtemp),"Started: "GAME_TIME_FORMAT,gmgametime);
  1176.       }
  1177.     else
  1178.       strcpy(msgtemp,"Started: ");
  1179.     message_send_text(c,message_type_info,c,msgtemp);
  1180.   }
  1181.   
  1182.   sprintf(msgtemp,"Status: %s",game_status_get_str(game_get_status(game)));
  1183.   message_send_text(c,message_type_info,c,msgtemp);
  1184.   
  1185.   sprintf(msgtemp,"Type: %-20.20s",game_type_get_str(game_get_type(game)));
  1186.   message_send_text(c,message_type_info,c,msgtemp);
  1187.   
  1188.   sprintf(msgtemp,"Speed: %s",game_speed_get_str(game_get_speed(game)));
  1189.   message_send_text(c,message_type_info,c,msgtemp);
  1190.   
  1191.   sprintf(msgtemp,"Difficulty: %s",game_difficulty_get_str(game_get_difficulty(game)));
  1192.   message_send_text(c,message_type_info,c,msgtemp);
  1193.   
  1194.   sprintf(msgtemp,"Option: %s",game_option_get_str(game_get_option(game)));
  1195.   message_send_text(c,message_type_info,c,msgtemp);
  1196.   
  1197.   {
  1198.     char const * mapname;
  1199.     
  1200.     if (!(mapname = game_get_mapname(game)))
  1201.       mapname = "unknown";
  1202.     sprintf(msgtemp,"Map: %-20.20s",mapname);
  1203.     message_send_text(c,message_type_info,c,msgtemp);
  1204.   }
  1205.   
  1206.   sprintf(msgtemp,"Map Size: %ux%u",game_get_mapsize_x(game),game_get_mapsize_y(game));
  1207.   message_send_text(c,message_type_info,c,msgtemp);
  1208.   sprintf(msgtemp,"Map Tileset: %s",game_tileset_get_str(game_get_tileset(game)));
  1209.   message_send_text(c,message_type_info,c,msgtemp);
  1210.   sprintf(msgtemp,"Map Type: %s",game_maptype_get_str(game_get_maptype(game)));
  1211.   message_send_text(c,message_type_info,c,msgtemp);
  1212.   
  1213.   sprintf(msgtemp,"Players: %u current, %u total, %u max",game_get_ref(game),game_get_count(game),game_get_maxplayers(game));
  1214.   message_send_text(c,message_type_info,c,msgtemp);
  1215.   
  1216.   {
  1217.     char const * description;
  1218.     
  1219.     if (!(description = game_get_description(game)))
  1220.       description = "";
  1221.     sprintf(msgtemp,"Description: %-20.20s",description);
  1222.   }
  1223.   
  1224.   return 0;
  1225. }
  1226. static int _handle_ladderactivate_command(t_connection * c, char const *text)
  1227. {
  1228.   ladderlist_make_all_active();
  1229.   message_send_text(c,message_type_info,c,"Copied current scores to active scores on all ladders.");
  1230.   return 0;
  1231. }
  1232. static int _handle_rehash_command(t_connection * c, char const *text)
  1233. {
  1234.   server_restart_wraper();  
  1235.   return 0;
  1236. }
  1237. /*
  1238. static int _handle_rank_all_accounts_command(t_connection * c, char const *text)
  1239. {
  1240.   // rank all accounts here
  1241.   accounts_rank_all();
  1242.   return 0;
  1243. }
  1244. */
  1245. static int _handle_shutdown_command(t_connection * c, char const *text)
  1246. {
  1247.   char         dest[32];
  1248.   unsigned int i,j;
  1249.   unsigned int delay;
  1250.   
  1251.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  1252.   for (; text[i]==' '; i++);
  1253.   for (j=0; text[i]!=' ' && text[i]!=''; i++) /* get dest */
  1254.     if (j<sizeof(dest)-1) dest[j++] = text[i];
  1255.   dest[j] = '';
  1256.   for (; text[i]==' '; i++);
  1257.   if (dest[0]=='')
  1258.     delay = prefs_get_shutdown_delay();
  1259.   else
  1260.     if (clockstr_to_seconds(dest,&delay)<0)
  1261.       {
  1262. message_send_text(c,message_type_error,c,"Invalid delay.");
  1263. return 0;
  1264.       }
  1265.   
  1266.   server_quit_delay(delay);
  1267.   
  1268.   if (delay)
  1269.     message_send_text(c,message_type_info,c,"You initialized the shutdown sequence.");
  1270.   else
  1271.     message_send_text(c,message_type_info,c,"You canceled the shutdown sequence.");
  1272.   
  1273.   return 0;
  1274. }
  1275. static int _handle_ladderinfo_command(t_connection * c, char const *text)
  1276. {
  1277.   char         dest[32];
  1278.   unsigned int rank;
  1279.   unsigned int i,j;
  1280.   t_account *  account;
  1281.   char const * clienttag;
  1282.   char const * tname;
  1283.   
  1284.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  1285.   for (; text[i]==' '; i++);
  1286.   for (j=0; text[i]!=' ' && text[i]!=''; i++) /* get dest */
  1287.     if (j<sizeof(dest)-1) dest[j++] = text[i];
  1288.   dest[j] = '';
  1289.   for (; text[i]==' '; i++);
  1290.   
  1291.   if (dest[0]=='')
  1292.     {
  1293.       message_send_text(c,message_type_info,c,"usage: /ladderinfo <rank> [clienttag]");
  1294.       return 0;
  1295.     }
  1296.   if (str_to_uint(dest,&rank)<0 || rank<1)
  1297.     {
  1298.       message_send_text(c,message_type_error,c,"Invalid rank.");
  1299.       return 0;
  1300.     }
  1301.   
  1302.   if (text[i]!='')
  1303.     clienttag = &text[i];
  1304.   else if (!(clienttag = conn_get_clienttag(c)))
  1305.     {
  1306.       message_send_text(c,message_type_error,c,"Unable to determine client game.");
  1307.       return 0;
  1308.     }
  1309.   
  1310.   if (strlen(clienttag)!=4)
  1311.     {
  1312.       sprintf(msgtemp,"You must supply a rank and a valid program ID. (Program ID "%.32s" is invalid.)",clienttag);
  1313.       message_send_text(c,message_type_error,c,msgtemp);
  1314.       message_send_text(c,message_type_error,c,"Example: /ladderinfo 1 STAR");
  1315.       return 0;
  1316.     }
  1317.   
  1318.   if (strcasecmp(clienttag,CLIENTTAG_STARCRAFT)==0)
  1319.     {
  1320.       if ((account = ladder_get_account_by_rank(rank,ladder_sort_highestrated,ladder_time_active,CLIENTTAG_STARCRAFT,ladder_id_normal)))
  1321. {
  1322.   sprintf(msgtemp,"Starcraft active  %5u: %-20.20s %u/%u/%u rating %u",
  1323.   rank,
  1324.   (tname = account_get_name(account)),
  1325.   account_get_ladder_active_wins(account,CLIENTTAG_STARCRAFT,ladder_id_normal),
  1326.   account_get_ladder_active_losses(account,CLIENTTAG_STARCRAFT,ladder_id_normal),
  1327.   account_get_ladder_active_disconnects(account,CLIENTTAG_STARCRAFT,ladder_id_normal),
  1328.   account_get_ladder_active_rating(account,CLIENTTAG_STARCRAFT,ladder_id_normal));
  1329.   account_unget_name(tname);
  1330. }
  1331.       else
  1332. sprintf(msgtemp,"Starcraft active  %5u: <none>",rank);
  1333.       message_send_text(c,message_type_info,c,msgtemp);
  1334.       
  1335.       if ((account = ladder_get_account_by_rank(rank,ladder_sort_highestrated,ladder_time_current,CLIENTTAG_STARCRAFT,ladder_id_normal)))
  1336. {
  1337.   sprintf(msgtemp,"Starcraft current %5u: %-20.20s %u/%u/%u rating %u",
  1338.   rank,
  1339.   (tname = account_get_name(account)),
  1340.   account_get_ladder_wins(account,CLIENTTAG_STARCRAFT,ladder_id_normal),
  1341.   account_get_ladder_losses(account,CLIENTTAG_STARCRAFT,ladder_id_normal),
  1342.   account_get_ladder_disconnects(account,CLIENTTAG_STARCRAFT,ladder_id_normal),
  1343.   account_get_ladder_rating(account,CLIENTTAG_STARCRAFT,ladder_id_normal));
  1344.   account_unget_name(tname);
  1345. }
  1346.       else
  1347. sprintf(msgtemp,"Starcraft current %5u: <none>",rank);
  1348.       message_send_text(c,message_type_info,c,msgtemp);
  1349.     }
  1350.   else if (strcasecmp(clienttag,CLIENTTAG_BROODWARS)==0)
  1351.     {
  1352.       if ((account = ladder_get_account_by_rank(rank,ladder_sort_highestrated,ladder_time_active,CLIENTTAG_BROODWARS,ladder_id_normal)))
  1353. {
  1354.   sprintf(msgtemp,"Brood War active  %5u: %-20.20s %u/%u/%u rating %u",
  1355.   rank,
  1356.   (tname = account_get_name(account)),
  1357.   account_get_ladder_active_wins(account,CLIENTTAG_BROODWARS,ladder_id_normal),
  1358.   account_get_ladder_active_losses(account,CLIENTTAG_BROODWARS,ladder_id_normal),
  1359.   account_get_ladder_active_disconnects(account,CLIENTTAG_BROODWARS,ladder_id_normal),
  1360.   account_get_ladder_active_rating(account,CLIENTTAG_BROODWARS,ladder_id_normal));
  1361.   account_unget_name(tname);
  1362. }
  1363.       else
  1364. sprintf(msgtemp,"Brood War active  %5u: <none>",rank);
  1365.       message_send_text(c,message_type_info,c,msgtemp);
  1366.       
  1367.       if ((account = ladder_get_account_by_rank(rank,ladder_sort_highestrated,ladder_time_current,CLIENTTAG_BROODWARS,ladder_id_normal)))
  1368. {
  1369.   sprintf(msgtemp,"Brood War current %5u: %-20.20s %u/%u/%u rating %u",
  1370.   rank,
  1371.   (tname = account_get_name(account)),
  1372.   account_get_ladder_wins(account,CLIENTTAG_BROODWARS,ladder_id_normal),
  1373.   account_get_ladder_losses(account,CLIENTTAG_BROODWARS,ladder_id_normal),
  1374.   account_get_ladder_disconnects(account,CLIENTTAG_BROODWARS,ladder_id_normal),
  1375.   account_get_ladder_rating(account,CLIENTTAG_BROODWARS,ladder_id_normal));
  1376.   account_unget_name(tname);
  1377. }
  1378.       else
  1379. sprintf(msgtemp,"Brood War current %5u: <none>",rank);
  1380.       message_send_text(c,message_type_info,c,msgtemp);
  1381.     }
  1382.   else if (strcasecmp(clienttag,CLIENTTAG_WARCIIBNE)==0)
  1383.     {
  1384.       if ((account = ladder_get_account_by_rank(rank,ladder_sort_highestrated,ladder_time_active,CLIENTTAG_WARCIIBNE,ladder_id_normal)))
  1385. {
  1386.   sprintf(msgtemp,"Warcraft II standard active  %5u: %-20.20s %u/%u/%u rating %u",
  1387.   rank,
  1388.   (tname = account_get_name(account)),
  1389.   account_get_ladder_active_wins(account,CLIENTTAG_WARCIIBNE,ladder_id_normal),
  1390.   account_get_ladder_active_losses(account,CLIENTTAG_WARCIIBNE,ladder_id_normal),
  1391.   account_get_ladder_active_disconnects(account,CLIENTTAG_WARCIIBNE,ladder_id_normal),
  1392.   account_get_ladder_active_rating(account,CLIENTTAG_WARCIIBNE,ladder_id_normal));
  1393.   account_unget_name(tname);
  1394. }
  1395.       else
  1396. sprintf(msgtemp,"Warcraft II standard active  %5u: <none>",rank);
  1397.       message_send_text(c,message_type_info,c,msgtemp);
  1398.       
  1399.       if ((account = ladder_get_account_by_rank(rank,ladder_sort_highestrated,ladder_time_active,CLIENTTAG_WARCIIBNE,ladder_id_ironman)))
  1400. {
  1401.   sprintf(msgtemp,"Warcraft II IronMan active   %5u: %-20.20s %u/%u/%u rating %u",
  1402.   rank,
  1403.   (tname = account_get_name(account)),
  1404.   account_get_ladder_active_wins(account,CLIENTTAG_WARCIIBNE,ladder_id_ironman),
  1405.   account_get_ladder_active_losses(account,CLIENTTAG_WARCIIBNE,ladder_id_ironman),
  1406.   account_get_ladder_active_disconnects(account,CLIENTTAG_WARCIIBNE,ladder_id_ironman),
  1407.   account_get_ladder_active_rating(account,CLIENTTAG_WARCIIBNE,ladder_id_ironman));
  1408.   account_unget_name(tname);
  1409. }
  1410.       else
  1411. sprintf(msgtemp,"Warcraft II IronMan active   %5u: <none>",rank);
  1412.       message_send_text(c,message_type_info,c,msgtemp);
  1413.       
  1414.       if ((account = ladder_get_account_by_rank(rank,ladder_sort_highestrated,ladder_time_current,CLIENTTAG_WARCIIBNE,ladder_id_normal)))
  1415. {
  1416.   sprintf(msgtemp,"Warcraft II standard current %5u: %-20.20s %u/%u/%u rating %u",
  1417.   rank,
  1418.   (tname = account_get_name(account)),
  1419.   account_get_ladder_wins(account,CLIENTTAG_WARCIIBNE,ladder_id_normal),
  1420.   account_get_ladder_losses(account,CLIENTTAG_WARCIIBNE,ladder_id_normal),
  1421.   account_get_ladder_disconnects(account,CLIENTTAG_WARCIIBNE,ladder_id_normal),
  1422.   account_get_ladder_rating(account,CLIENTTAG_WARCIIBNE,ladder_id_normal));
  1423.   account_unget_name(tname);
  1424. }
  1425.       else
  1426. sprintf(msgtemp,"Warcraft II standard current %5u: <none>",rank);
  1427.       message_send_text(c,message_type_info,c,msgtemp);
  1428.       
  1429.       if ((account = ladder_get_account_by_rank(rank,ladder_sort_highestrated,ladder_time_current,CLIENTTAG_WARCIIBNE,ladder_id_ironman)))
  1430. {
  1431.   sprintf(msgtemp,"Warcraft II IronMan current  %5u: %-20.20s %u/%u/%u rating %u",
  1432.   rank,
  1433.   (tname = account_get_name(account)),
  1434.   account_get_ladder_wins(account,CLIENTTAG_WARCIIBNE,ladder_id_ironman),
  1435.   account_get_ladder_losses(account,CLIENTTAG_WARCIIBNE,ladder_id_ironman),
  1436.   account_get_ladder_disconnects(account,CLIENTTAG_WARCIIBNE,ladder_id_ironman),
  1437.   account_get_ladder_rating(account,CLIENTTAG_WARCIIBNE,ladder_id_ironman));
  1438.   account_unget_name(tname);
  1439. }
  1440.       else
  1441. sprintf(msgtemp,"Warcraft II IronMan current  %5u: <none>",rank);
  1442.       message_send_text(c,message_type_info,c,msgtemp);
  1443.     }
  1444.   // --> aaron
  1445.   else if (strcasecmp(clienttag,CLIENTTAG_WARCRAFT3)==0 || strcasecmp(clienttag,CLIENTTAG_WAR3XP)==0)
  1446.     {
  1447.       unsigned int teamcount = 0;
  1448.       if ((account = ladder_get_account(solo_ladder(clienttag),rank,&teamcount,clienttag)))
  1449. {
  1450.   sprintf(msgtemp,"WarCraft3 Solo   %5u: %-20.20s %u/%u/0",
  1451.   rank,
  1452.   (tname = account_get_name(account)),
  1453.   account_get_solowin(account,clienttag),
  1454.   account_get_sololoss(account,clienttag));
  1455.   account_unget_name(tname);
  1456. }
  1457.       else
  1458. sprintf(msgtemp,"WarCraft3 Solo   %5u: <none>",rank);
  1459.       message_send_text(c,message_type_info,c,msgtemp);
  1460.       
  1461.       if ((account = ladder_get_account(team_ladder(clienttag),rank,&teamcount,clienttag)))
  1462. {
  1463.   sprintf(msgtemp,"WarCraft3 Team   %5u: %-20.20s %u/%u/0",
  1464.   rank,
  1465.   (tname = account_get_name(account)),
  1466.   account_get_teamwin(account,clienttag),
  1467.   account_get_teamloss(account,clienttag));
  1468.   account_unget_name(tname);
  1469. }
  1470.       else
  1471. sprintf(msgtemp,"WarCraft3 Team   %5u: <none>",rank);
  1472.       message_send_text(c,message_type_info,c,msgtemp);
  1473.       
  1474.       if ((account = ladder_get_account(ffa_ladder(clienttag),rank,&teamcount,clienttag)))
  1475. {
  1476.   sprintf(msgtemp,"WarCraft3 FFA   %5u: %-20.20s %u/%u/0",
  1477.   rank,
  1478.   (tname = account_get_name(account)),
  1479.   account_get_ffawin(account,clienttag),
  1480.   account_get_ffaloss(account,clienttag));
  1481.   account_unget_name(tname);
  1482. }
  1483.       else
  1484. sprintf(msgtemp,"WarCraft3 FFA   %5u: <none>",rank);
  1485.       message_send_text(c,message_type_info,c,msgtemp);
  1486.       
  1487.       if ((account = ladder_get_account(at_ladder(clienttag),rank,&teamcount,clienttag)))
  1488. {
  1489.   if (account_get_atteammembers(account,teamcount,clienttag))
  1490.     sprintf(msgtemp,"WarCraft3 AT Team   %5u: %-80.80s %u/%u/0",
  1491.     rank,
  1492.     account_get_atteammembers(account,teamcount,clienttag),
  1493.     account_get_atteamwin(account,teamcount,clienttag),
  1494.     account_get_atteamloss(account,teamcount,clienttag));
  1495.   else
  1496.     sprintf(msgtemp,"WarCraft3 AT Team   %5u: <invalid team info>",rank);
  1497. }
  1498.       else
  1499. sprintf(msgtemp,"WarCraft3 AT Team  %5u: <none>",rank);
  1500.       message_send_text(c,message_type_info,c,msgtemp);
  1501.     }
  1502.   //<---
  1503.   else
  1504.     {
  1505.       message_send_text(c,message_type_error,c,"This game does not support win/loss records.");
  1506.       message_send_text(c,message_type_error,c,"You must supply a rank and a valid program ID.");
  1507.       message_send_text(c,message_type_error,c,"Example: /ladderinfo 1 STAR");
  1508.     }
  1509.   
  1510.   return 0;
  1511. }
  1512. static int _handle_timer_command(t_connection * c, char const *text)
  1513. {
  1514.   unsigned int i,j;
  1515.   unsigned int delta;
  1516.   char         deltastr[64];
  1517.   t_timer_data data;
  1518.   
  1519.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  1520.   for (; text[i]==' '; i++);
  1521.   for (j=0; text[i]!=' ' && text[i]!=''; i++) /* get comm */
  1522.     if (j<sizeof(deltastr)-1) deltastr[j++] = text[i];
  1523.   deltastr[j] = '';
  1524.   for (; text[i]==' '; i++);
  1525.   
  1526.   if (deltastr[0]=='')
  1527.     {
  1528.       message_send_text(c,message_type_info,c,"usage: /timer <duration>");
  1529.       return 0;
  1530.     }
  1531.   
  1532.   if (clockstr_to_seconds(deltastr,&delta)<0)
  1533.     {
  1534.       message_send_text(c,message_type_error,c,"Invalid duration.");
  1535.       return 0;
  1536.     }
  1537.   
  1538.   if (text[i]=='')
  1539.     data.p = strdup("Your timer has expired.");
  1540.   else
  1541.     data.p = strdup(&text[i]);
  1542.   
  1543.   if (timerlist_add_timer(c,time(NULL)+(time_t)delta,user_timer_cb,data)<0)
  1544.     {
  1545.       eventlog(eventlog_level_error,"handle_command","could not add timer");
  1546.       free(data.p);
  1547.       message_send_text(c,message_type_error,c,"Could not set timer.");
  1548.     }
  1549.   else
  1550.     {
  1551.       sprintf(msgtemp,"Timer set for %s",seconds_to_timestr(delta));
  1552.       message_send_text(c,message_type_info,c,msgtemp);
  1553.     }
  1554.   
  1555.   return 0;
  1556. }
  1557. static int _handle_serverban_command(t_connection *c, char const *text)
  1558. {
  1559.   char dest[USER_NAME_MAX];
  1560.   char messagetemp[MAX_MESSAGE_LEN];
  1561.   t_connection * dest_c;
  1562.   unsigned int i,j;
  1563.   
  1564.   for (i=0; text[i]!=' ' && text[i]!=''; i++); // skip command 
  1565.   for (; text[i]==' '; i++);
  1566.   for (j=0; text[i]!=' ' && text[i]!=''; i++) // get dest
  1567.     if (j<sizeof(dest)-1) dest[j++] = text[i];
  1568.   dest[j] = '';
  1569.   for (; text[i]==' '; i++);
  1570.   
  1571.       if (dest[0]=='')
  1572.       {
  1573. message_send_text(c,message_type_info,c,"usage: /serverban <account>");
  1574. return 0;
  1575.       }
  1576.     
  1577.       if (!(dest_c = connlist_find_connection_by_accountname(dest)))
  1578. {
  1579.   message_send_text(c,message_type_error,c,"That user is not logged on.");
  1580.   return 0;
  1581. }
  1582.       sprintf(messagetemp,"Banning User %s who is using IP %s",conn_get_username(dest_c),addr_num_to_ip_str(conn_get_game_addr(dest_c)));
  1583.       message_send_text(c,message_type_info,c,messagetemp);
  1584.       message_send_text(c,message_type_info,c,"Users Account is also LOCKED! Only a Admin can Unlock it!");
  1585.       sprintf(msgtemp,"/ipban a %s",addr_num_to_ip_str(conn_get_game_addr(dest_c)));
  1586.       handle_ipban_command(c,msgtemp);
  1587.       account_set_auth_lock(conn_get_account(dest_c),1);
  1588.       //now kill the connection
  1589.       sprintf(msgtemp,"You have been banned by Admin: %s",conn_get_username(c));
  1590.       message_send_text(dest_c,message_type_error,dest_c,msgtemp);
  1591.       message_send_text(dest_c,message_type_error,dest_c,"Your account is also LOCKED! Only a admin can UNLOCK it!");
  1592.       conn_set_state(dest_c, conn_state_destroy);
  1593.       return 0;
  1594. }
  1595. static int _handle_netinfo_command(t_connection * c, char const *text)
  1596. {
  1597.   char           dest[USER_NAME_MAX];
  1598.   unsigned int   i,j;
  1599.   t_connection * conn;
  1600.   t_game const * game;
  1601.   unsigned int   addr;
  1602.   unsigned short port;
  1603.   unsigned int   taddr;
  1604.   unsigned short tport;
  1605.   
  1606.   for (i=0; text[i]!=' ' && text[i]!=''; i++); // skip command 
  1607.   for (; text[i]==' '; i++);
  1608.   for (j=0; text[i]!=' ' && text[i]!=''; i++) // get dest
  1609.     if (j<sizeof(dest)-1) dest[j++] = text[i];
  1610.   dest[j] = '';
  1611.   for (; text[i]==' '; i++);
  1612.   
  1613.   if (dest[0]=='')
  1614.     {
  1615.       char const * tname;
  1616.       
  1617.       strcpy(dest,(tname = conn_get_username(c)));
  1618.       conn_unget_username(c,tname);
  1619.     }
  1620.   
  1621.   if (!(conn = connlist_find_connection_by_accountname(dest)))
  1622.     {
  1623.       message_send_text(c,message_type_error,c,"That user is not logged on.");
  1624.       return 0;
  1625.     }
  1626.   
  1627.   if (conn_get_account(conn)!=conn_get_account(c) &&
  1628.       prefs_get_hide_addr() && !(account_get_command_groups(conn_get_account(c)) & command_get_group("/admin-addr"))) // default to false 
  1629.     {
  1630.       message_send_text(c,message_type_error,c,"Address information for other users is only available to admins.");
  1631.       return 0;
  1632.     }
  1633.   
  1634.   sprintf(msgtemp,"Server TCP: %s (bind %s)",addr_num_to_addr_str(conn_get_real_local_addr(conn),conn_get_real_local_port(conn)),addr_num_to_addr_str(conn_get_local_addr(conn),conn_get_local_port(conn)));
  1635.   message_send_text(c,message_type_info,c,msgtemp);
  1636.   
  1637.   sprintf(msgtemp,"Client TCP: %s",addr_num_to_addr_str(conn_get_addr(conn),conn_get_port(conn)));
  1638.   message_send_text(c,message_type_info,c,msgtemp);
  1639.   
  1640.   taddr=addr = conn_get_game_addr(conn);
  1641.   tport=port = conn_get_game_port(conn);
  1642.   gametrans_net(conn_get_addr(c),conn_get_port(c),addr,port,&taddr,&tport);
  1643.   
  1644.   if (taddr==addr && tport==port)
  1645.     sprintf(msgtemp,"Client UDP: %s",
  1646.     addr_num_to_addr_str(addr,port));
  1647.   else
  1648.     sprintf(msgtemp,"Client UDP: %s (trans %s)",
  1649.     addr_num_to_addr_str(addr,port),
  1650.     addr_num_to_addr_str(taddr,tport));
  1651.   message_send_text(c,message_type_info,c,msgtemp);
  1652.   
  1653.   if ((game = conn_get_game(conn)))
  1654.     {
  1655.       taddr=addr = game_get_addr(game);
  1656.       tport=port = game_get_port(game);
  1657.       gametrans_net(conn_get_addr(c),conn_get_port(c),addr,port,&taddr,&tport);
  1658.       
  1659.       if (taddr==addr && tport==port)
  1660. sprintf(msgtemp,"Game UDP:  %s",
  1661. addr_num_to_addr_str(addr,port));
  1662.       else
  1663. sprintf(msgtemp,"Game UDP:  %s (trans %s)",
  1664. addr_num_to_addr_str(addr,port),
  1665. addr_num_to_addr_str(taddr,tport));
  1666.     }
  1667.   else
  1668.     strcpy(msgtemp,"Game UDP:  none");
  1669.   message_send_text(c,message_type_info,c,msgtemp);
  1670.   
  1671.   return 0;
  1672. }
  1673. static int _handle_quota_command(t_connection * c, char const * text)
  1674. {
  1675.   sprintf(msgtemp,"Your quota allows you to write %u lines per %u seconds.",prefs_get_quota_lines(),prefs_get_quota_time());
  1676.   message_send_text(c,message_type_info,c,msgtemp);
  1677.   sprintf(msgtemp,"Long lines will be considered to wrap every %u characters.",prefs_get_quota_wrapline());
  1678.   message_send_text(c,message_type_info,c,msgtemp);
  1679.   sprintf(msgtemp,"You are not allowed to send lines with more than %u characters.",prefs_get_quota_maxline());
  1680.   message_send_text(c,message_type_info,c,msgtemp);
  1681.   
  1682.   return 0;
  1683. }
  1684. static int _handle_lockacct_command(t_connection * c, char const *text)
  1685. {
  1686.   t_connection * user;
  1687.   t_account *    account;
  1688.  
  1689.   text = skip_command(text); 
  1690.   
  1691.   if (text[0]=='')
  1692.     {
  1693.       message_send_text(c,message_type_info,c,"usage: /lockacct <username>");
  1694.       return 0;
  1695.     }
  1696.   
  1697.   if (!(account = accountlist_find_account(text)))
  1698.     {
  1699.       message_send_text(c,message_type_error,c,"Invalid user.");
  1700.       return 0;
  1701.     }
  1702.   if ((user = connlist_find_connection_by_accountname(text)))
  1703.     message_send_text(user,message_type_info,user,"Your account has just been locked by admin.");
  1704.   
  1705.   account_set_auth_lock(account,1);
  1706.   message_send_text(c,message_type_error,c,"That user account is now locked.");
  1707.   return 0;
  1708. }
  1709. static int _handle_unlockacct_command(t_connection * c, char const *text)
  1710. {
  1711.   t_connection * user;
  1712.   t_account *    account;
  1713.  
  1714.   text = skip_command(text); 
  1715.   
  1716.   if (text[0]=='')
  1717.     {
  1718.       message_send_text(c,message_type_info,c,"usage: /unlockacct <username>");
  1719.       return 0;
  1720.     }
  1721.   if (!(account = accountlist_find_account(text)))
  1722.     {
  1723.       message_send_text(c,message_type_error,c,"Invalid user.");
  1724.       return 0;
  1725.     }
  1726.   
  1727.   if ((user = connlist_find_connection_by_accountname(text)))
  1728.     message_send_text(user,message_type_info,user,"Your account has just been unlocked by admin.");
  1729.   
  1730.   account_set_auth_lock(account,0);
  1731.   message_send_text(c,message_type_error,c,"That user account is now unlocked.");
  1732.   return 0;
  1733. }     
  1734. static int _handle_flag_command(t_connection * c, char const *text)
  1735. {
  1736.   char         dest[32];
  1737.   unsigned int i,j;
  1738.   unsigned int newflag;
  1739.   
  1740.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  1741.   for (; text[i]==' '; i++);
  1742.   for (j=0; text[i]!=' ' && text[i]!=''; i++) /* get dest */
  1743.     if (j<sizeof(dest)-1) dest[j++] = text[i];
  1744.   dest[j] = '';
  1745.   for (; text[i]==' '; i++);
  1746.   
  1747.   if (dest[0]=='')
  1748.     {
  1749.       message_send_text(c,message_type_info,c,"usage: /flag <flag>");
  1750.       return 0;
  1751.     }
  1752.     
  1753.   newflag = strtoul(dest,NULL,0);
  1754.   conn_set_flags(c,newflag);
  1755.   
  1756.   sprintf(msgtemp,"Flags set to 0x%08x.",newflag);
  1757.   message_send_text(c,message_type_info,c,msgtemp);
  1758.   return 0;
  1759. }
  1760. static int _handle_tag_command(t_connection * c, char const *text)
  1761. {
  1762.   char         dest[8];
  1763.   unsigned int i,j;
  1764.   
  1765.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  1766.   for (; text[i]==' '; i++);
  1767.   for (j=0; text[i]!=' ' && text[i]!=''; i++) /* get dest */
  1768.     if (j<sizeof(dest)-1) dest[j++] = text[i];
  1769.   dest[j] = '';
  1770.   for (; text[i]==' '; i++);
  1771.  
  1772.   if (dest[0]=='')
  1773.   {
  1774. message_send_text(c,message_type_info,c,"usage: /tag <clienttag>");
  1775. return 0;
  1776.   }
  1777.   if (strlen(dest)!=4)
  1778.     {
  1779.       message_send_text(c,message_type_error,c,"Client tag should be four characters long.");
  1780.       return 0;
  1781.     }
  1782.     
  1783.   conn_set_clienttag(c,dest);
  1784.   sprintf(msgtemp,"Client tag set to %s.",dest);
  1785.   message_send_text(c,message_type_info,c,msgtemp);
  1786.   return 0;
  1787. }
  1788. static int _handle_set_command(t_connection * c, char const *text)
  1789. {
  1790.   t_account * account;
  1791.   char *accname;
  1792.   char *key;
  1793.   char *value;
  1794.   char t[MAX_MESSAGE_LEN];
  1795.   unsigned int i,j;
  1796.   char         arg1[256];
  1797.   char         arg2[256];
  1798.   char         arg3[256];
  1799.   
  1800.   strncpy(t, text, MAX_MESSAGE_LEN - 1);
  1801.   for (i=0; t[i]!=' ' && t[i]!=''; i++); /* skip command /set */
  1802.   
  1803.   for (; t[i]==' '; i++); /* skip spaces */
  1804.   for (j=0; t[i]!=' ' && t[i]!=''; i++) /* get username */
  1805.     if (j<sizeof(arg1)-1) arg1[j++] = t[i];
  1806.   arg1[j] = '';
  1807.   
  1808.   for (; t[i]==' '; i++); /* skip spaces */
  1809.   for (j=0; t[i]!=' ' && t[i]!=''; i++) /* get key */
  1810.     if (j<sizeof(arg2)-1) arg2[j++] = t[i];
  1811.   arg2[j] = '';
  1812.   
  1813.   for (; t[i]==' '; i++); /* skip spaces */
  1814.   for (j=0; t[i]!=''; i++) /* get value */
  1815.     if (j<sizeof(arg3)-1) arg3[j++] = t[i];
  1816.   arg3[j] = '';
  1817.   
  1818.   accname = arg1;
  1819.   key     = arg2;
  1820.   value   = arg3;
  1821.   if ((arg1[0] =='') || (arg2[0]==''))
  1822.   {
  1823. message_send_text(c,message_type_info,c,"usage: /set <username> <key> [value]");
  1824.   }
  1825.     
  1826.   if (!(account = accountlist_find_account(accname)))
  1827.     {
  1828.       message_send_text(c,message_type_error,c,"Invalid user.");
  1829.       return 0;
  1830.     }
  1831.   
  1832.   if (*value == '')
  1833.     {
  1834.       if (account_get_strattr(account,key))
  1835. {
  1836.   sprintf(msgtemp, "current value of %.64s is "%.128s"",key,account_get_strattr(account,key));
  1837.   message_send_text(c,message_type_error,c,msgtemp);
  1838. }
  1839.       else
  1840. message_send_text(c,message_type_error,c,"value currently not set");
  1841.       return 0;
  1842.     }
  1843.   
  1844.   if (account_set_strattr(account,key,value)<0)
  1845.     message_send_text(c,message_type_error,c,"Unable to set key");
  1846.   else
  1847.     message_send_text(c,message_type_error,c,"Key set succesfully");
  1848.   
  1849.   return 0;
  1850. }
  1851. static int _handle_motd_command(t_connection * c, char const *text)
  1852. {
  1853.   char const * filename;
  1854.   FILE *       fp;
  1855.   
  1856.   if ((filename = prefs_get_motdfile())) {
  1857.     if ((fp = fopen(filename,"r")))
  1858.       {
  1859. message_send_file(c,fp);
  1860. if (fclose(fp)<0)
  1861.   eventlog(eventlog_level_error,"handle_command","could not close motd file "%s" after reading (fopen: %s)",filename,strerror(errno));
  1862.       }
  1863.     else
  1864.       {
  1865. eventlog(eventlog_level_error,"handle_command","could not open motd file "%s" for reading (fopen: %s)",filename,strerror(errno));
  1866. message_send_text(c,message_type_error,c,"Unable to open motd.");
  1867.       }
  1868.     return 0;
  1869.   } else {
  1870.     message_send_text(c,message_type_error,c,"No motd.");
  1871.     return 0;
  1872.   }
  1873. }
  1874. static int _handle_ping_command(t_connection * c, char const *text)
  1875. {
  1876.   unsigned int i;
  1877.   t_connection * user;
  1878.   t_game  * game;
  1879.   char const *   tname;
  1880.   
  1881.   for (i=0; text[i]!=' ' && text[i]!=''; i++); /* skip command */
  1882.   for (; text[i]==' '; i++);
  1883.   
  1884.   if (text[i]=='')
  1885.     {
  1886.       if ((game=conn_get_game(c)))
  1887. {
  1888.   for (i=0; i<game_get_count(game); i++)
  1889.     {
  1890.       if ((user = game_get_player_conn(game, i)))
  1891. {
  1892.   sprintf(msgtemp,"%s latency: %9u",(tname = conn_get_username(user)),conn_get_latency(user));
  1893.   conn_unget_username(user,tname);
  1894.   message_send_text(c,message_type_info,c,msgtemp);
  1895. }
  1896.     }
  1897.   return 0;
  1898. }
  1899.       sprintf(msgtemp,"Your latency %9u",conn_get_latency(c));
  1900.     }
  1901.   else if ((user = connlist_find_connection_by_accountname(&text[i])))
  1902.     sprintf(msgtemp,"%s latency %9u",&text[i],conn_get_latency(user));
  1903.   else
  1904.     sprintf(msgtemp,"Invalid user");
  1905.   
  1906.   message_send_text(c,message_type_info,c,msgtemp);
  1907.   return 0;
  1908. }
  1909. /* Redirected to handle_ipban_command in ipban.c [Omega]
  1910. static int _handle_ipban_command(t_connection * c, char const *text)
  1911. {
  1912.   handle_ipban_command(c,text);
  1913.   return 0;
  1914. }
  1915. */
  1916. static int _handle_commandgroups_command(t_connection * c, char const * text)
  1917. {
  1918.     t_account * account;
  1919.     char * command;
  1920.     char * username;
  1921.     unsigned int usergroups; // from user account
  1922.     unsigned int groups = 0; // converted from arg3
  1923.     char tempgroups[8]; // converted from usergroups
  1924.     char  t[MAX_MESSAGE_LEN];
  1925.     unsigned int i,j;
  1926.     char arg1[256];
  1927.     char arg2[256];
  1928.     char arg3[256];
  1929.   
  1930.     strncpy(t, text, MAX_MESSAGE_LEN - 1);
  1931.     for (i=0; t[i]!=' ' && t[i]!=''; i++); /* skip command /groups */
  1932.     
  1933.     for (; t[i]==' '; i++); /* skip spaces */
  1934.     for (j=0; t[i]!=' ' && t[i]!=''; i++) /* get command */
  1935. if (j<sizeof(arg1)-1) arg1[j++] = t[i];
  1936.     arg1[j] = '';
  1937.   
  1938.     for (; t[i]==' '; i++); /* skip spaces */
  1939.     for (j=0; t[i]!=' ' && t[i]!=''; i++) /* get username */
  1940. if (j<sizeof(arg2)-1) arg2[j++] = t[i];
  1941.     arg2[j] = '';
  1942.   
  1943.     for (; t[i]==' '; i++); /* skip spaces */
  1944.     for (j=0; t[i]!=''; i++) /* get groups */
  1945. if (j<sizeof(arg3)-1) arg3[j++] = t[i];
  1946.     arg3[j] = '';
  1947.   
  1948.     command = arg1;
  1949.     username = arg2;
  1950.     if (arg1[0] =='') {
  1951. message_send_text(c,message_type_info,c,"usage: /cg <command> <username> [<group(s)>]");
  1952. return 0;
  1953.     }
  1954.   
  1955.     if (!strcmp(command,"help") || !strcmp(command,"h")) {
  1956. message_send_text(c,message_type_info,c,"Command Groups (Defines the Groups of Commands a User Can Use.)");
  1957. message_send_text(c,message_type_info,c,"Type: /cg add <username> <group(s)> - adds group(s) to user profile");
  1958. message_send_text(c,message_type_info,c,"Type: /cg del <username> <group(s)> - deletes group(s) from user profile");
  1959. message_send_text(c,message_type_info,c,"Type: /cg list <username> - shows current groups user can use");
  1960. return 0;
  1961.     }
  1962.     
  1963.     if (arg2[0] =='') {
  1964. message_send_text(c,message_type_info,c,"usage: /cg <command> <username> [<group(s)>]");
  1965. return 0;
  1966.     }
  1967.     if (!(account = accountlist_find_account(username))) {
  1968. message_send_text(c,message_type_error,c,"Invalid user.");
  1969. return 0;
  1970.     }
  1971.     
  1972.     usergroups = account_get_command_groups(account);
  1973.     if (!strcmp(command,"list") || !strcmp(command,"l")) {
  1974. if (usergroups & 1) tempgroups[0] = '1'; else tempgroups[0] = ' ';
  1975. if (usergroups & 2) tempgroups[1] = '2'; else tempgroups[1] = ' ';
  1976. if (usergroups & 4) tempgroups[2] = '3'; else tempgroups[2] = ' ';
  1977. if (usergroups & 8) tempgroups[3] = '4'; else tempgroups[3] = ' ';
  1978. if (usergroups & 16) tempgroups[4] = '5'; else tempgroups[4] = ' ';
  1979. if (usergroups & 32) tempgroups[5] = '6'; else tempgroups[5] = ' ';
  1980. if (usergroups & 64) tempgroups[6] = '7'; else tempgroups[6] = ' ';
  1981. if (usergroups & 128) tempgroups[7] = '8'; else tempgroups[7] = ' ';
  1982. sprintf(msgtemp, "%s's command group(s): %s", username, tempgroups);
  1983. message_send_text(c,message_type_info,c,msgtemp);
  1984. return 0;
  1985.     }
  1986.     
  1987.     if (arg3[0] =='') {
  1988. message_send_text(c,message_type_info,c,"usage: /cg <command> <username> [<group(s)>]");
  1989. return 0;
  1990.     }
  1991.     for (i=0; arg3[i] != ''; i++) {
  1992. if (arg3[i] == '1') groups |= 1;
  1993. else if (arg3[i] == '2') groups |= 2;
  1994. else if (arg3[i] == '3') groups |= 4;
  1995. else if (arg3[i] == '4') groups |= 8;
  1996. else if (arg3[i] == '5') groups |= 16;
  1997. else if (arg3[i] == '6') groups |= 32;
  1998. else if (arg3[i] == '7') groups |= 64;
  1999. else if (arg3[i] == '8') groups |= 128;
  2000. else {
  2001.     sprintf(msgtemp, "got bad group: %c", arg3[i]);
  2002.     message_send_text(c,message_type_info,c,msgtemp);
  2003.     return 0;
  2004. }
  2005.     }
  2006.     if (!strcmp(command,"add") || !strcmp(command,"a")) {
  2007. account_set_command_groups(account, usergroups | groups);
  2008. sprintf(msgtemp, "groups %s has been added to user: %s", arg3, username);
  2009. message_send_text(c,message_type_info,c,msgtemp);
  2010. return 0;
  2011.     }
  2012.     
  2013.     if (!strcmp(command,"del") || !strcmp(command,"d")) {
  2014. account_set_command_groups(account, usergroups & (255 - groups));
  2015. sprintf(msgtemp, "groups %s has been deleted from user: %s", arg3, username);
  2016. message_send_text(c,message_type_info,c,msgtemp);
  2017. return 0;
  2018.     }
  2019.     
  2020.     sprintf(msgtemp, "got unknown command: %s", command);
  2021.     message_send_text(c,message_type_info,c,msgtemp);
  2022.     return 0;
  2023. }
  2024. static int _handle_topic_command(t_connection * c, char const * text)
  2025. {
  2026.   char const * channel_name;
  2027.   char const * topic;
  2028.   char * tmp;
  2029.   t_channel * channel;
  2030.   int  do_save = NO_SAVE_TOPIC;
  2031.   channel_name = skip_command(text);
  2032.   if ((topic = strchr(channel_name,'"')))
  2033.   {
  2034.     tmp = (char *)topic;
  2035.     for (tmp--;tmp[0]==' ';tmp--);
  2036.     tmp[1]='';
  2037.     topic++;
  2038.     tmp  = strchr(topic,'"');
  2039.     if (tmp) tmp[0]='';
  2040.   }
  2041.   eventlog(eventlog_level_trace,__FUNCTION__,"channel: %s topic: %s",channel_name,topic);
  2042.   if (channel_name[0]=='')
  2043.   {
  2044.     if (channel_get_topic(channel_get_name(conn_get_channel(c))))
  2045.     {
  2046.       sprintf(msgtemp,"%s topic: %s",channel_get_name(conn_get_channel(c)),channel_get_topic(channel_get_name(conn_get_channel(c))));
  2047.     }
  2048.     else
  2049.     {
  2050.       sprintf(msgtemp,"%s topic: no topic",channel_get_name(conn_get_channel(c)));
  2051.     }
  2052.     message_send_text(c,message_type_info,c,msgtemp);
  2053.    
  2054.     return 0;
  2055.   }
  2056.   if (!(topic))
  2057.   {
  2058.     if (channel_get_topic(channel_name))
  2059.     {
  2060.       sprintf(msgtemp,"%s topic: %s",channel_name, channel_get_topic(channel_name));
  2061.     }
  2062.     else
  2063.     {
  2064.       sprintf(msgtemp,"%s topic: no topic",channel_name);
  2065.     }
  2066.     message_send_text(c,message_type_info,c,msgtemp);
  2067.     return 0;
  2068.   }
  2069.   if (!(account_is_operator_or_admin(conn_get_account(c),channel_get_name(conn_get_channel(c))))) {
  2070. message_send_text(c,message_type_error,c,"You must be at least a Channel Operator to use this command.");
  2071. return -1;
  2072.   }
  2073.   if (!(channel = channellist_find_channel_by_name(channel_name,conn_get_country(c),conn_get_realmname(c))))
  2074.   {
  2075.     sprintf(msgtemp,"no such channel, can't set topic");
  2076.     message_send_text(c,message_type_error,c,msgtemp);
  2077.     return -1;
  2078.   }
  2079.   
  2080.   if (channel_get_permanent(channel))
  2081.     do_save = DO_SAVE_TOPIC;
  2082.   channel_name = channel_get_name(channel);
  2083.   channel_set_topic(channel_name, topic, do_save);
  2084.   sprintf(msgtemp,"%s topic: %s",channel_name, topic);
  2085.   message_send_text(c,message_type_info,c,msgtemp);
  2086.   return 0;
  2087. }