Add 2-sec delay before issuing rmatch
[capablanca.git] / lasker-2.2.3 / bots / mamer / CommandEntry.cc
1 //--------------------------------------------------------------------------
2 // CommandEntry.cc - Source file for the CommandEntry
3 //
4 // Matthew E. Moses & Michael A. Long
5 //
6 // $Revision: 1.13 $
7 // $Date: 1998/09/10 19:57:17 $
8 //
9 // $Author: mlong $
10 // $Locker:  $
11 //
12 // $Log: CommandEntry.cc,v $
13 // Revision 1.13  1998/09/10 19:57:17  mlong
14 // lots of little bug fixes and a few new features
15 //
16 // Revision 1.12  1998/06/18 18:41:30  mlong
17 // prepairing for yet another move.
18 //
19 // Revision 1.11  1998/06/08 20:41:17  mlong
20 // changes to the list tournies function
21 //
22 // Revision 1.10  1998/04/29 15:23:19  mlong
23 // prepairing for the move to daimi
24 // new sorting routine.
25 //
26 // Revision 1.9  1998/04/18 18:46:04  mlong
27 // fixed delete bug &
28 // added delete tourney function
29 //
30 // Revision 1.5  1997/10/08 21:03:35  chess
31 // preparing for move to oracle machine at eworks.
32 //
33 // Revision 1.4  1997/05/15 18:27:53  chess
34 // added Player and TourneyPlayers support
35 // added HandleGetPlayerInfo & HandleGetGameInfo
36 //
37 // Revision 1.3  1997/04/13 03:14:35  chess
38 // commands to do user statistic manipulationn added:
39 // setinfo - sets a whole line of information
40 // setstat - sets a particular stat
41 // addabuse - adds (or deletes) abuse points.
42 //
43 // Revision 1.2  1997/03/21 15:32:36  moses
44 // added the shutdown command.
45 //
46 // Revision 1.1  1996/10/01  20:14:43  moses
47 // Initial revision
48 //
49 //--------------------------------------------------------------------------
50
51 // static char RCSid[] = "$Id: CommandEntry.cc,v 1.13 1998/09/10 19:57:17 mlong Exp $";
52
53 #include "CommandEntry.hh"
54 #include "Mamer.hh"
55
56 extern Mamer gMamer;
57
58 //- AddAbuse -------------------------------------------------------
59 int CommandEntry::AddAbuse(User *user, param_list params) {
60     User *u = NULL;
61     char name[MAX_WORD_SIZE];
62     int needToDelete=0;
63
64     if(params[0].type == TYPE_WORD) {
65       strcpy(name, params[0].val.word);
66     }
67     
68     u = gMamer.FindUser(name);
69     if(u == NULL) {
70       u = new User();
71       u->LoadPlayer(gMamer.userFilePath, name);  // Loads the player info into memory and saves current info to disk
72       needToDelete = 1;
73     }
74     
75     if((u->GetManagerLevel() >= user->GetManagerLevel()) &&
76        (user->GetManagerLevel() != PRESIDENT)) {
77       if(needToDelete) delete u;
78       gMamer.TellUser(NoPermissions, user->name);
79       return 0;
80     }
81
82     if(u != NULL) {
83       if(params[1].type == TYPE_INT) {
84         u->AddAbuse(params[1].val.integer);
85       } else {
86         u->AddAbuse(10);
87       }
88       u->SavePlayer(gMamer.userFilePath);
89       if(u->GetAbuse() >= MAX_CHAOS_POINTS)
90         gMamer.XServerCom("%s %s%s", "+ censor", u->name, "\n");
91       gMamer.TellUser(ChangedAbuse, user->name, u->name, u->GetAbuse());
92     } else {
93       gMamer.TellUser(NotFound, user->name, name);
94     }
95     if(needToDelete) delete u;
96
97     return(1);
98 } //- End of AddAbuse
99
100 //- FingerUser -------------------------------------------------------
101 int CommandEntry::FingerUser(User *user, param_list params) {
102     User *u = NULL;
103     int notFound=1;
104     char name[32];
105
106     memset(name, '\0', 32);
107     if(params[0].type == TYPE_WORD) {
108       strncpy(name, params[0].val.word, MIN(31, (int)strlen(params[0].val.word)));
109     } else {
110       strcpy(name, user->name);
111     }
112     
113     u = gMamer.FindUser(name);
114     if(u != NULL) notFound = 0;
115     
116     if(notFound) { 
117       u = new User();
118       notFound = u->LoadPlayer(gMamer.userFilePath, name);
119       notFound = !notFound;
120     }
121     if(!notFound) {
122       gMamer.XServerCom("%s %s %s%s%s", "qtell", user->name, "\\n", u->name, "'s Stats:\\n\\n");
123       gMamer.XServerCom("%-17s %5s %4s %4s %3s %3s %3s %3s %5s %6s%-17s %4s %3s %3s %3s %3s %3s %3s %5s %6s",
124                         "Name", " Tnys", "  W ", "  L ", " D ", "1st", "2nd", "3rd", "Chaos", "Rating\\n",
125                         "-----------------", "-----", "----", "----", "---", "---", "---", "---", "-----","------\\n");
126       gMamer.XServerCom("%-17s %5ld %4ld %4ld %3ld %3ld %3ld %3ld %5d %6.2f %s",
127                         u->name, u->GetPlayedTourneys(), u->GetWins(), u->GetLosses(), u->GetDraws(),
128                         u->GetFirsts(), u->GetSeconds(), u->GetThirds(), u->GetAbuse(), u->GetRating(), "\\n");
129       if(u->GetManagerLevel() > USER) {
130         gMamer.XServerCom("%s %d %s %d %s", "\\nManager Level:", u->GetManagerLevel(), 
131                                             "    Managed Tourneys:", u->GetManagedTourneys(), "\\n");
132       }
133       gMamer.XServerCom("%s", "\n");
134     } else {
135       gMamer.TellUser(NotFound, user->name, name);
136     }
137     if(notFound) delete u;
138
139     return(1);
140 } //- End of FingerUser
141
142 //- ListRank ----------------------------------------------------------
143 int CommandEntry::ListRank(User *user, param_list params) {
144   float rating=0;
145   int start=0, i=0, end=0, tourneys=0, counter=0;
146   char filename[128], name[32], name2[32];
147   FILE *theFile;
148
149   memset(name, '\0', 32);
150   memset(name2, '\0', 32);
151   switch (params[0].type) {
152   case TYPE_WORD:
153     strcpy(name, params[0].val.word);
154     break;
155   case TYPE_INT:
156     start = params[0].val.integer;
157     if(start <= 0) {start = 1;}
158     break;
159   default:
160     strcpy(name, user->name);
161     break;
162   }
163   
164   sprintf(filename, "%s/rank", gMamer.dataFilePath);
165   if(params[0].type != TYPE_INT) {
166     if((theFile = fopen(filename, "r"))) {
167       while(fscanf(theFile, "%s %d %f", name2, &tourneys, &rating) > 0) {
168         if(!(strncasecmp(name2, name, strlen(name)))) {
169           start = i+1;
170           break;
171         }
172         i++;
173       }
174       fclose(theFile);
175     } else {
176       gMamer.TellUser(NotFound, user->name, filename);
177       return(0);
178     }
179   }
180   if(!(start)) {
181     gMamer.TellUser(NotFound, user->name, name);
182     return(1);
183   }
184   start = start - 10;
185   end = start + 20;
186   if(start <= 0) {start = 1; end = 21;}
187   gMamer.XServerCom("%s %s %s %s%s %-5s %-18s %5s %6s %5s %-18s %5s %6s", "qtell", user->name, "\\n", gMamer.username, 
188                     "'s Rankings:\\n\\n", "Rank", "Name", "Trnys", "Rating\\n", 
189                     "-----", "------------------", "-----", "------\n");
190   gMamer.XServerCom("%s %s %s", "qtell", user->name, "\\n");
191   if(!(theFile = fopen(filename, "r"))) { return(0); }
192   i = 1; counter = 1;
193   while(fscanf(theFile, "%s %d %f", name2, &tourneys, &rating) > 0) {
194     if((i >= start) && (i < end)) {
195       if(i == start) { counter = 1; }
196       gMamer.XServerCom(" %-5d %-18s %5d %6.2f\\n", i, name2, tourneys, rating);
197       if(((counter % 10) == 0) && (counter > 0)) {
198         gMamer.XServerCom("%s", "\n");
199         if(i != (end -1)) {
200           gMamer.XServerCom("%s %s %s", "qtell", user->name, "\\n");
201         }
202       }
203     }
204     if(i > end) { break; }
205     i++; counter++;
206   }
207   fclose(theFile);
208   
209   if(i <= end) { gMamer.XServerCom("%s", "\n"); }
210
211   return(1);
212 }
213
214 //- ListManagers ------------------------------------------------------
215 int CommandEntry::ListManagers(User *user, param_list params) {
216     int i=1, needToDelete=0;
217     long last;
218     char filename[256], manager[NAMELEN], date[16];
219     User *u=NULL, *newUser = NULL;
220     struct tm *tmpDate;
221     FILE *theFile;
222
223     i = params[0].type; // just to get rid of the compiler messages
224     sprintf(filename, "%s/managers", gMamer.dataFilePath);
225     if((theFile = fopen(filename, "r"))) {
226       gMamer.XServerCom("%s %s %s %s%s", "qtell", user->name, "\\n", gMamer.username, "'s Manager List:\\n\\n");
227       gMamer.XServerCom("%2s%-18s %3s %4s %-8s%2s%-18s %3s %4s %-8s%s",
228                         "","Name","Lvl","Tnys","Last", "","Name","Lvl","Tnys","Last", "\\n");
229       gMamer.XServerCom("  %-18s %3s %4s %-8s%2s%-18s %3s %4s %-8s%s",
230                         "-----------------", "---", "----", "--------", "",
231                         "-----------------", "---", "----", "--------", "", "\\n");
232       i=1;
233       memset(date, '\0', 64);
234       gMamer.XServerCom("\n%s %s ", "qtell", user->name);
235       while(fscanf(theFile, "%s", manager) > 0) {
236         needToDelete = 0;
237         u = gMamer.FindUser(manager);
238         if(u == NULL) {
239           needToDelete = 1;
240           newUser = new User();
241           u = newUser;
242         }
243         if(0 != u->LoadPlayer(gMamer.userFilePath, manager)) {
244           last = u->GetLast();
245           if(last) {
246             tmpDate = localtime(&last);   
247             sprintf(date, "%02d/%02d/%02d", tmpDate->tm_mon+1, tmpDate->tm_mday, tmpDate->tm_year);
248           } else {
249             sprintf(date, "none");
250           }
251         } else {
252           sprintf(date, "%s", "none");
253         }
254         gMamer.XServerCom("%2s%-18s %3d %4d %8s%s",
255                           ((gMamer.UserIsLoaded(manager)) ? "+" : " "),
256                           manager, u->GetManagerLevel(), u->GetManagedTourneys(), date, (i%2)==0 ? "\\n":"");
257         if(((i % 20) == 0) && (i > 0)) {
258           i = 0;
259           gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n");
260         }
261         i++;
262         if(needToDelete) {
263           u = NULL;
264           delete(newUser);        
265         }
266       }
267       fclose(theFile);
268       gMamer.XServerCom("%s", "\n");
269       
270       return(1);
271     }    
272     gMamer.TellUser(NotFound, user->name, filename);
273     return(0);
274 }
275
276 //- LoadedUsers -------------------------------------------------------
277 int CommandEntry::LoadedUsers(User *user, param_list params) {
278   User *u = NULL;
279   LinkListIter<User> userIter(gMamer.userList);
280   int i, count=0;
281   
282   i = params[0].type;
283   i = 1;
284   
285   gMamer.XServerCom("qtell %s \\nLoaded Users:\\n\\n", user->name);
286   while((u = userIter.Next())) {
287     count++;
288     gMamer.XServerCom("  %18s%s", u->name, (i%3)==0 ? "\\n":"");
289     if(((i % 30) == 0) && (i > 0)) {
290       i = 0;
291       gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n");
292     }    
293     i++;
294   }
295   gMamer.XServerCom("%sTotal: %i%s", "\\n", count, "\n");
296   
297   return(1);
298 } //- End of LoadedUser
299
300 //- SetCommandLevel ----------------------------------------------------
301 int CommandEntry::SetCommandLevel(User *user, param_list params) {
302   Command *c = NULL;
303
304   c = gMamer.FindCommand(params[0].val.word, user->name);
305
306   if(c != NULL) {
307     if((c->GetManagerLevel() <= user->GetManagerLevel()) && 
308        (params[1].val.integer <= user->GetManagerLevel())) {
309       c->SetManagerLevel((ranks)params[1].val.integer);
310       gMamer.TellUser(ChangedCommandLevel, user->name, params[0].val.word, params[1].val.integer);
311     } else
312       gMamer.TellUser(NoPermissions, user->name);
313   } else 
314     return 0;
315   
316   return 1;
317 }
318
319 //- SetInfo -------------------------------------------------------
320 int CommandEntry::SetInfo(User *user, param_list params) {
321     User *u = NULL;
322     int notFound=1, i;
323     char name[32];
324
325     memset(name, '\0', 32);
326     if(params[0].type == TYPE_WORD) { 
327       strncpy(name, params[0].val.word, MIN(31, (int)strlen(params[0].val.word))); 
328     }
329
330     u = gMamer.FindUser(name);
331     if(u != NULL) notFound = 0;
332
333     if(notFound) {
334       u = new User();
335       u->LoadPlayer(gMamer.userFilePath, name);
336     }
337
338     if(u != NULL) {
339       if((u->GetManagerLevel() >= user->GetManagerLevel()) &&
340          (user->GetManagerLevel() != PRESIDENT)) {
341         if(notFound) delete u;
342         gMamer.TellUser(NoPermissions, user->name);
343         return 0;
344       }
345       for(i=1; i<=7; i++)
346         u->SetStatistic(i, params[i].val.integer);
347       u->SavePlayer(gMamer.userFilePath);
348       gMamer.TellUser(ChangedInfo, user->name, u->name);
349     } else {
350       gMamer.TellUser(NotFound, user->name, name);
351     }
352     if(notFound) delete u;
353
354     return(1);
355 } //- End of SetInfo
356
357 //- SetManagerLevel -------------------------------------------------------
358 int CommandEntry::SetManagerLevel(User *user, param_list params) {
359   User *u = NULL;
360   int notFound=1, new_level=1, length=0, i=0;
361   char name[32];
362   
363   if(params[0].type == TYPE_WORD) { 
364     length = strlen(params[0].val.word);
365     memset(name, '\0', 32);
366     while((i < 31) && (i < length)) {
367       name[i] = tolower(params[0].val.word[i]);
368       i++;
369     }
370   }
371   new_level = params[1].val.integer;
372   
373   u = gMamer.FindUser(name);
374   if(u != NULL) notFound = 0;
375   
376   if(notFound) {
377     u = new User();
378     u->LoadPlayer(gMamer.userFilePath, name);
379   }
380   if(((u->GetManagerLevel() >= user->GetManagerLevel()) ||
381       (new_level >= user->GetManagerLevel())) &&
382      (user->GetManagerLevel() != PRESIDENT)) {
383     if(notFound) delete u;
384     gMamer.TellUser(NoPermissions, user->name);
385     return 0;
386   }
387
388   if(u != NULL) {
389     u->ChangeManagerLevel(new_level);
390     u->SavePlayer(gMamer.userFilePath);
391     gMamer.TellUser(ChangedManagerLevel, user->name, u->name, new_level);
392   } else {
393     gMamer.TellUser(NotFound, user->name, name);
394   }
395   if(notFound) delete u;
396   
397   if(new_level > 0)
398     return(1);
399   else
400     return -1;
401 } //- End of SetManagerLevel
402
403
404 //- SetStat -------------------------------------------------------
405 int CommandEntry::SetStat(User *user, param_list params) {
406     User *u = NULL;
407     int notFound=1, new_value, i, ret=0, size=0, counter=0;
408     char which_stat[64], name[32];
409     strings statAliases[] = {
410       {"tourneys", 1}, {"tnys", 1},
411       {"wins", 2},
412       {"losses", 3}, {"lose", 3},
413       {"draws", 4},
414       {"firsts", 5}, {"1sts", 5},
415       {"seconds", 6}, {"2nds", 6},
416       {"thirds", 7}, {"3rds", 7},
417       {"abuse", 8}, 
418       {"rating", 9},
419       {"managedtourneys", 10},
420       {NULL}
421     };
422
423     memset(which_stat, '\0', 64);
424     if(params[0].type == TYPE_WORD) { strcpy(name, params[0].val.word); }
425     if(params[1].type == TYPE_WORD) { strncpy(which_stat, params[1].val.word, MIN(63, strlen(params[1].val.word))); }    
426     size = strlen(which_stat);
427     new_value = params[2].val.integer;
428
429     u = gMamer.FindUser(name);
430     if(u != NULL) notFound = 0;    
431
432     if(notFound) { 
433       u = new User(); 
434       u->LoadPlayer(gMamer.userFilePath, name);
435     }
436     if(u != NULL) {
437       if((u->GetManagerLevel() >= user->GetManagerLevel()) &&
438          (user->GetManagerLevel() != PRESIDENT)) {
439         if(notFound) delete u;
440         gMamer.TellUser(NoPermissions, user->name);
441         return 0;
442       }
443       i=0;
444       while(statAliases[i].string != NULL) {
445         if (!(strncasecmp(statAliases[i].string, which_stat, MIN(size, (int)strlen(statAliases[i].string))))) {
446           counter++;
447           if(counter > 1) break;
448         }       
449         i++;
450       }
451       if(counter > 1) {
452         gMamer.TellUser(CanNotChange, user->name, u->name, which_stat, new_value);
453       } else if(counter == 0) {
454         gMamer.TellUser(NotFound, user->name, which_stat);
455       } else {
456         i=0;
457         while(statAliases[i].string != NULL) {
458           if (!(strncasecmp(statAliases[i].string, which_stat, MIN(size, (int)strlen(statAliases[i].string))))) {
459             ret = u->SetStatistic(statAliases[i].number, new_value);
460             memset(which_stat, '\0', 64);
461             strcpy(which_stat, statAliases[i].string);
462             break;
463           }
464           i++;
465         }
466         u->SavePlayer(gMamer.userFilePath);
467         if(ret)
468           gMamer.TellUser(ChangedInfo, user->name, u->name, which_stat, new_value);
469         else 
470           gMamer.TellUser(NotFound, user->name, which_stat);
471       }
472     } else {
473       gMamer.TellUser(NotFound, user->name, name);
474     }
475     if(notFound) delete u;
476
477     return(1);
478 } //- End of SetStat
479
480 //- ShowCommands --------------------------------------------
481 int CommandEntry::ShowCommands(User *user, param_list params) {
482   Command *c = NULL;
483   LinkListIter<Command> commIter(gMamer.commandList);
484   char *command;
485   int i;
486
487   if(params[0].type == TYPE_WORD) {
488     command = params[0].val.word;
489     while((c = commIter.Next())) if(1 == c->IsCommand(command)) break;
490     if(c == NULL) {
491       gMamer.TellUser(NotFound, user->name, command);
492       return 0;
493     }
494     gMamer.XServerCom("qtell %s %s Notes: %-16s | %-5s | %3d | %s \n", 
495             user->name, gMamer.username, c->GetCommandName(), 
496             c->GetCommandAlias(), c->GetManagerLevel(), c->GetCommandDescription());
497     return(1);
498   }
499   gMamer.XServerCom("qtell %s %s's Command List:\\n\\n", user->name, gMamer.username);
500   i = 0;
501   while((c = commIter.Next())) {
502     gMamer.XServerCom(" %-16s | %-5s | %3d | %s\\n",
503             c->GetCommandName(), c->GetCommandAlias(), c->GetManagerLevel(), c->GetCommandDescription());
504     if((!(i % 9)) && (i > 0)) {
505         i = 0;
506         gMamer.XServerCom("%s", "\n");
507         gMamer.XServerCom("qtell %s \\n", user->name);
508     }
509     i++;
510   }
511   gMamer.XServerCom("%s", "\n");
512   return(1);
513 }
514
515 //- ShowHelp -----------------------------------------------
516 int CommandEntry::ShowHelp(User *user, param_list params) {
517   int i=1;
518   char tmpBuffer[1024], request[128], filename[256];
519   FILE *theFile;
520
521   memset(request, '\0', 128);
522   if(params[0].type == TYPE_WORD) { 
523     strcpy(request, params[0].val.word);
524   } else { 
525     strcpy(request, "index"); 
526   }
527   sprintf(filename, "%s/%s", gMamer.helpFilePath, request);
528   if((theFile = fopen(filename, "r"))) {
529     gMamer.XServerCom("qtell %s \\nThe %s Help File:\\n\\n", user->name, request);
530     i=1;
531     memset(filename, '\0', 256);
532     while(fgets(filename, 79, theFile)) {    /* Just reusing the variable filename could be any char [] */      
533       memset(tmpBuffer, '\0', 1024);
534       strcpy(tmpBuffer, gMamer.s_and_r(filename, "\n", "\\n"));
535       gMamer.XServerCom("%s", tmpBuffer);
536       if(((i % 10) == 0) && (i > 0)) {
537         i = 0;
538         gMamer.XServerCom("\nqtell %s \\n", user->name);
539       }
540       i++;
541       memset(filename, '\0', 256);
542     }
543     fclose(theFile);
544     gMamer.XServerCom("\n");
545     
546     return(1);
547   }
548   gMamer.TellUser(NotFound, user->name, request);
549   return(0);
550 }//- End of ShowHelp
551
552 //- CreateTourney ------------------------------------------------------------
553 int CommandEntry::CreateTourney(User *user, param_list params) {
554   Tourney *t = NULL;
555   int num = gMamer.GenerateTourneyNumber();
556
557   params[0].type = params[0].type;  // Just to stop the annoying unused variable messages during compile.
558   t = new Tourney(num, user, &(gMamer.tourneyParams));
559   gMamer.tourneyList.Append(t);
560   gMamer.XServerCom("%s %s %s %d %s", "xtell", user->name, "Created tourney number: ", t->number, "\n");  
561   return(1);
562 }//- End CreateTourney
563
564 //- OpenTourney ------------------------------------------------------------
565 int CommandEntry::OpenTourney(User *user, param_list params) {
566   Tourney *tourn = NULL;
567
568   tourn = gMamer.FindTourney(params[0].val.integer);
569   if(NULL != tourn) {
570     if(tourn->Open()) {
571       tourn->Announce();
572       return(1);
573     }
574   }
575   gMamer.TellUser(NotFound, user->name, "tourney");  
576   return(0);
577 }//- End OpenTourney
578
579 //- AnnounceTourney ----------------------------------------------------------
580 int CommandEntry::AnnounceTourney(User *user, param_list params) {
581   Tourney *tourn = NULL;
582
583   tourn = gMamer.FindTourney(params[0].val.integer);
584   if(NULL != tourn) {
585     if(tourn->GetStatus() == OPEN) {
586       tourn->Announce();
587       return(1);
588     } else {
589       gMamer.TellUser(TourneyNotOpen, user->name, params[0].val.integer);
590       return 0;
591     }
592   } else {
593     gMamer.TellUser(NotFound, user->name, "tourney");  
594     return(0);
595   }
596 }//- AnnounceTourney ---------------------------------------------------------
597
598 //- KeepTourney ------------------------------------------------------------
599 int CommandEntry::KeepTourney(User *user, param_list params) {
600   Tourney *t = NULL;
601
602   t = gMamer.FindTourney(params[0].val.integer);
603   if(NULL != t) {
604     if(params[1].type != TYPE_NULL) 
605       if(params[1].type == TYPE_WORD) {
606         if(strncasecmp("y", params[1].val.word, 1) == 0) {
607           t->SetPersist(1);
608           gMamer.TellUser(WillKeepTourney, user->name, params[0].val.integer);
609         } else {
610           t->SetPersist(0);
611           gMamer.TellUser(NotKeepTourney, user->name, params[0].val.integer);
612         }
613       } else if(params[1].type == TYPE_INT) {
614         t->SetPersist(params[1].val.integer);
615         if(params[1].val.integer)
616           gMamer.TellUser(WillKeepTourney, user->name, params[0].val.integer);
617         else
618           gMamer.TellUser(NotKeepTourney, user->name, params[0].val.integer);
619       } else {
620         gMamer.TellUser(NotFound, user->name, "tourney");  
621         return(0);
622       }
623     return(1);
624   }
625
626   gMamer.TellUser(NotFound, user->name, "tourney");  
627   return(0);
628 }//- End KeepTourney
629
630 //- DeleteTourney ------------------------------------------------------------
631 int CommandEntry::DeleteTourney(User *user, param_list params) {
632   Tourney *t = NULL;
633   TourneyPlayers *tp = NULL;
634
635   t = gMamer.FindTourney(params[0].val.integer);
636   if(NULL != t) {
637     if(t->GetStatus() != DONE) {
638       LinkListIter<TourneyPlayers> playerIter(t->playerList);
639       playerIter.Reset();
640       while((tp = playerIter.Next())) {
641         gMamer.XServerCom("%s %s %d%s", "tournset", tp->name, 0, "\n");
642         gMamer.XServerCom("tell %s Tourney#%d has been deleted.%s", tp->name, t->number, "\n");
643       }
644       gMamer.XServerCom("%s %d %s%d %s", "tell", gMamer.channelNumber, 
645                         "Tourney #", params[0].val.integer, "has been deleted.\n"); 
646     }
647     gMamer.tourneyList.Delete(t);  // delete the tourney
648     return(1);
649   }
650   
651   gMamer.TellUser(NotFound, user->name, "tourney");  
652   return(0);
653 }//- End DeleteTourney
654
655 //- CloseTourney ------------------------------------------------------------
656 int CommandEntry::CloseTourney(User *user, param_list params) {
657   Tourney *tourn = NULL;
658
659   tourn = gMamer.FindTourney(params[0].val.integer);
660   if(NULL != tourn) {
661     if(tourn->GetPlayerCount() >= MINIMUM_PLAYERS) {
662       if(tourn->GetStatus() == OPEN) {      
663         tourn->CloseAndStart();
664         gMamer.XServerCom("qtell %s %s Notes: %s %d %s", 
665                           user->name,gMamer.username,"Tourney #", 
666                           tourn->number, " is now closed.\n");
667         return(1);
668       } else {
669         gMamer.TellUser(TourneyNotOpen, user->name, tourn->number);
670       }
671     } else {
672       gMamer.TellUser(NotEnoughPlayers, user->name, tourn->number);
673     }
674   } else {
675     gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer);
676   }
677     
678   return(0);
679 }//- End CloseTourney
680
681 int CommandEntry::ListTourneys(User *user, param_list params) {
682   Tourney *t = NULL;
683   LinkListIter<Tourney> tournIter(gMamer.tourneyList);
684   int notourneys = 1, Tstatus=0, i=3;
685   long stDate, enDate, timeNow;
686   struct tm *start, *end;
687   char outStart[128], outEnd[128], outStatus[128];  
688
689   params[0].type = params[0].type;  // Just to stop the annoying unused var messages in compile.
690   while((t = tournIter.Next())) notourneys = 0;
691
692   if(notourneys == 0) {
693     gMamer.XServerCom("qtell %s %s Notes: \\n", user->name, gMamer.username);
694     gMamer.XServerCom(" %3s %3s %3s %4s %3s %2s %4s %9s %6s %-14s %-14s\\n", 
695                       "No.","Rds","Sty", "Time", "Inc", "Md", "Vrnt", "Rtng Rnge", "Status","  Started at  ", "   Ended at   ");
696     gMamer.XServerCom(" %3s %3s %3s %4s %3s %2s %4s %9s %6s %-14s %-14s\\n", 
697                       "---","---","---", "----", "---", "--", "----", "---------", "------","--------------", "--------------");
698     tournIter.Reset();
699     while((t = tournIter.Next())) {
700       stDate = t->GetStartDate();
701       enDate = t->GetEndDate();
702       Tstatus = t->GetStatus();
703       if((Tstatus == DONE) && (t->GetPersist() == 0)){
704         timeNow = time(0);
705         if((timeNow - enDate) > KEEP_TOURNEY_TIME) {
706           gMamer.tourneyList.Delete(t);
707           continue;
708         }
709       }
710       if(stDate > 0) {
711         start = localtime(&stDate);
712         sprintf(outStart, "%02d:%02d %02d/%02d/%02d", 
713                 start->tm_hour, start->tm_min, start->tm_mon+1, start->tm_mday, start->tm_year);
714       } else { strcpy(outStart, "n/a"); }      
715       if(enDate > 0) {
716         end = localtime(&enDate);
717         sprintf(outEnd, "%02d:%02d %02d/%02d/%02d", 
718                 end->tm_hour, end->tm_min, end->tm_mon+1, end->tm_mday, end->tm_year);
719       } else { strcpy(outEnd, "n/a"); }
720       if(Tstatus == NEW)
721         sprintf(outStatus, "%s", "new");
722       else if(Tstatus == OPEN) 
723         sprintf(outStatus, "%s", "open");
724       else if(Tstatus == CLOSED)
725         sprintf(outStatus, "%s", "closed");
726       else if(Tstatus == DONE)
727         sprintf(outStatus, "%s", "done");
728       else
729         memset(outStatus, '\0', 128);
730
731       gMamer.XServerCom(" %3d %3d %3c %4d %3d %2c %4c %4d-%4d %6s %-14s %-14s\\n", 
732                         t->number, t->params.rounds, t->params.style, t->params.time, t->params.inc, 
733                         t->params.mode, t->params.variant, t->params.ratingLow, t->params.ratingHigh, 
734                         outStatus, outStart, outEnd);
735       if(((i % 12) == 0) && (i > 0)) {
736         i = 0;
737         gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n");
738       }
739       i++;      
740     }
741     gMamer.XServerCom("%s", "\n");
742   } else {
743     gMamer.XServerCom("qtell %s %s Notes: %s", user->name, gMamer.username, "No tourneys right now.\n");    
744   }
745
746   return (1);
747 }
748
749 //- JoinTourney ------------------------------------------------------------
750 int CommandEntry::JoinTourney(User *user, param_list params) {
751   Tourney *tourn = NULL;
752   Player *newEntry = NULL;
753 printf("join\n");
754   tourn = gMamer.FindTourney(params[0].val.integer);
755   
756   if(NULL != tourn) {    
757     newEntry = new Player(user->name, params[0].val.integer);
758 printf("entry=%d\n",newEntry);
759     gMamer.pendingList.Append(newEntry);
760     gMamer.XServerCom("getpi %s%s", user->name, "\n");
761     return(1);
762   }
763 printf("error\n");
764   gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer);
765   return(0);
766 }
767
768 //- AddToTourney ------------------------------------------------------------
769 int CommandEntry::AddToTourney(User *user, param_list params) {
770   Tourney *tourn = NULL;
771   Player *newEntry = NULL;
772
773   tourn = gMamer.FindTourney(params[1].val.integer);
774   
775   if(NULL != tourn) {
776     newEntry = new Player(params[0].val.word, params[1].val.integer);
777     gMamer.pendingList.Append(newEntry);
778     gMamer.XServerCom("getpi %s%s", params[0].val.word, "\n");
779     return(1);
780   }
781
782   gMamer.TellUser(TourneyNotFound, user->name,  params[1].val.integer);
783   return(0);
784 }
785
786 //- RemoveFromTourney ------------------------------------------------------------
787 int CommandEntry::RemoveFromTourney(User *user, param_list params) {
788   Tourney *tourn = NULL;
789   TourneyPlayers *tp=NULL;
790   char name[NAMELEN], reason[64];
791   int num=0;
792   User *u=NULL;
793   int chaosPointsEarned=0, needToDelete=0;
794
795   memset(name, '\0', NAMELEN);
796   memset(reason, '\0', 64);
797   if(params[0].type == TYPE_INT) {  // if we are withdrawing ourselves
798     tourn = gMamer.FindTourney(params[0].val.integer);
799     strcpy(name, user->name);
800     u = user;
801     num = params[0].val.integer;
802     strcpy(reason, "withdrew");
803   } else {  // if a manager is forfeiting us
804     tourn = gMamer.FindTourney(params[1].val.integer);
805     strcpy(name, params[0].val.word);
806     u = gMamer.FindUser(params[0].val.word);
807     num = params[1].val.integer;
808     strcpy(reason, "was forfeited");
809   }
810
811   if(NULL == tourn) {
812     gMamer.TellUser(TourneyNotFound, user->name, num);
813     return 0;
814   }
815   if(tourn->GetStatus() == DONE) {
816     gMamer.TellUser(TourneyDone, user->name, num);
817     return 0;
818   }
819   tp = tourn->GetPlayer(name);   //Get the players info
820   if(tp == NULL) {
821     gMamer.TellUser(NotFound, user->name, name, num);// Player is not found in this tourney
822     return 0;
823   }
824
825   gMamer.XServerCom("%s %s %d%s", "tournset", name, 0, "\n");
826   if(tourn->IsNotClosed()) { //If we get past this check it will cost the user chaos points
827     tourn->playerList.Delete(tp);
828     tourn->CalculateAverage();
829     gMamer.TellUser(PlayerRemoved, user->name, name, num);
830     gMamer.XServerCom("%s %d %s %s %s%d %d%s\n","tell", gMamer.channelNumber, name, reason, "from tourney #", 
831                       tourn->number, tourn->GetPlayerCount(), " player(s) now");
832     return 0; 
833   } // otherwise tourney is closed and started
834
835   chaosPointsEarned = tourn->RemovePlayer(name);  // RemovePlayer will return the number of rounds
836   if(chaosPointsEarned >= 0) {                    // that were disturbed
837     if(NULL == u) {
838       u = new User(gMamer.userFilePath, name);  // Make a new user - this will create a file but there
839       needToDelete = 1;                         // should already be one cause they are in the tourney
840     }
841     u->AddAbuse(chaosPointsEarned * PENALTY_PER_ROUND);  // add the choas points and save them
842     u->SavePlayer(gMamer.userFilePath);
843     if(u->GetAbuse() >= MAX_CHAOS_POINTS)
844       gMamer.XServerCom("%s %s%s", "+ censor", u->name, "\n");
845     if(needToDelete) delete(u);                 // we created a new user so we should delete him here
846     gMamer.TellUser(PlayerRemoved, user->name, name, num);
847     gMamer.XServerCom("%s %d %s %s %s%d\n","tell",gMamer.channelNumber,name, reason,
848                       "from tourney #", tourn->number);
849     return 1;
850   }
851   return 1;
852 }
853
854 //- ListTourneyGames ------------------------------------------------------------
855 int CommandEntry::ListTourneyGames(User *user, param_list params) {
856   Tourney *t = NULL;
857   TourneyPlayers *white, *black;
858   int i = 0;
859   Game *g = NULL;
860   
861   t = gMamer.FindTourney(params[0].val.integer);
862   if(NULL != t) {
863     LinkListIter<Game> gameIter(t->gameList);
864     gameIter.Reset();
865     gMamer.XServerCom("%s %s %s %d %s",  "qtell", user->name, "Tourney Games for Round #", t->GetRound(), "\\n\\n");
866     gMamer.XServerCom("%3s %18s %6s %6s %2s %-18s %6s %6s %s",
867                       "", "White", "[SCR ]", "[Rtng]", "vs", "Black", "[SCR ]", "[Rtng]",
868                       "\\n---------------------------------------------------------------------------\\n");
869     while((g = gameIter.Next())) {
870       if(!(i % 10) && (i>0)) {
871         gMamer.XServerCom("\nqtell %s %s", user->name, "\\n");
872       }
873
874       white = t->GetPlayer(g->whiteName);
875       black = t->GetPlayer(g->blackName);
876
877       if(g->gameNumber > 0) {
878         gMamer.XServerCom("%3d %18s [%4.1f] [%4i] vs %-18s [%4.1f] [%4i] %3i%s",
879                           i+1, g->whiteName, white->score, white->rating,
880                           g->blackName, black->score, black->rating, g->gameNumber, "\\n");
881       } else {
882         gMamer.XServerCom("%3d %18s [%4.1f] [%4i] vs %-18s [%4.1f] [%4i] none%s",
883                           i+1, g->whiteName, white->score, white->rating,
884                           g->blackName, black->score, black->rating, "\\n");
885       }
886       i++;
887     }
888     gMamer.XServerCom("%s", "\\n\n");
889     return(1);
890   }
891
892   gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer);
893   return(0);
894 }//- End of ListTourneyGames
895
896 //- ListTourneyPlayers ------------------------------------------------------------
897 int CommandEntry::ListTourneyPlayers(User *user, param_list params) {
898   Tourney *t = NULL;
899   Player *p = NULL, *opp=NULL;
900   TourneyPlayers *tp = NULL;
901   char color, result;
902   int i = 0, counter = 0;
903
904   t = gMamer.FindTourney(params[0].val.integer);
905   if(NULL != t) {
906     if(t->GetPlayerCount() == 0) {
907       gMamer.TellUser(NoPlayers, user->name, params[0].val.integer);
908       return 0;
909     }
910     t->SortPlayers();
911     gMamer.XServerCom("%s %s %s %s %d %s %d %s %3s %-17s %6s %5s %6s %-6s %-7s %s %3s %-17s %6s %5s %6s %6s %-7s %s", 
912                       "qtell", user->name, "Tourney Players:", "Round", t->GetRound(), "of", t->params.rounds, 
913                       "\\n\\n", "", "Name", "Rating", "Score", "Perfrm", "Upset ", "Results", "\\n",
914                       "", "-----------------", "------", "-----", "------", "------", "-------", "\\n");
915     LinkListIter<TourneyPlayers> playerIter(t->playerList);
916     playerIter.Reset();
917     while((tp = playerIter.Next())) { counter++; }  // count the number of players
918     for(i=1; i<=counter; i++) {
919       p = t->GetSortPlayer(i);
920       tp = t->GetPlayer(p->name);
921       if(tp->activeFlag > 0) 
922         gMamer.XServerCom("%3d %s%-17s [%4d]  %3.1f  [%4d] [%4d] ", 
923                           i, ((tp->location == ONLINE) ? "+" : "-"), 
924                           tp->name, tp->rating, tp->score, tp->perform, tp->upset);
925       else 
926         gMamer.XServerCom("%3d %s%-17s [%4s]  %3.1f  [%4d] [%4d] ", 
927                           i, ((tp->location == ONLINE) ? "+" : "-"), 
928                           tp->name, "forf", tp->score, tp->perform, tp->upset);
929       LinkListIter<Player> opponentIter(tp->opponentList);  // List of opponents this player has had
930       opponentIter.Reset();
931       while((opp = opponentIter.Next())) {
932         p = t->GetSortPlayer(opp->name);
933         if(opp->value) { color = 'w'; } else { color = 'b'; }
934         if(opp->floatValue == 1.0) {
935           result = '+';
936         } else if(opp->floatValue == 0.5) { 
937           result = '='; 
938         } else if(opp->floatValue == 0.0) { 
939           result = '-'; 
940         } else {
941           result = '*'; 
942         }
943         gMamer.XServerCom("%c%-0.2d%c ", result, p->value, color);
944       }
945       if(((i % 9) == 0) && (i > 0)) {
946         gMamer.XServerCom("%s %s %s %s", "\n", "qtell", user->name, "\\n");
947       } else {
948         gMamer.XServerCom("%s", "\\n");
949       }
950     }
951     gMamer.XServerCom("%-24s %6.1f %s", "\\n     Average Rating", t->GetAverageRating(), "\\n\n");
952     return(1);
953   }
954
955   gMamer.TellUser(TourneyNotFound, user->name, params[0].val.integer);
956   return(0);
957 }//- End of ListTourneyPlayers
958
959 //- ListTourneyVars -----------------------------------------------------
960 int CommandEntry::ListTourneyVars(User *user, param_list params) {
961   Tourney *tourn = NULL;
962
963   tourn = gMamer.FindTourney(params[0].val.integer);
964
965   if(NULL != tourn) {
966     gMamer.XServerCom("%s %s %s", "qtell", user->name, "\\n");
967     gMamer.XServerCom(" %18s %4d %s", "(T)ime: ", tourn->params.time, "\\n");
968     gMamer.XServerCom(" %18s %4d %s", "(I)ncrement: ", tourn->params.inc, "\\n");
969     gMamer.XServerCom(" %18s %4d %s", "(R)ounds: ", tourn->params.rounds, "\\n");
970     gMamer.XServerCom(" %18s %4d %s", "Max (P)layers: ", tourn->params.maxPlayers, "\\n");
971     gMamer.XServerCom(" %18s %4c %s", "(M)ode: ", tourn->params.mode, "(r)ated or (u)nrated\\n");
972     gMamer.XServerCom(" %18s %4c %s", "(S)tyle: ", tourn->params.style, "(s)wiss or (r)oundrobin\\n");
973     gMamer.XServerCom(" %18s %4c %s","(V)ariant: ",tourn->params.variant, "(w)ild, (r)egular, (b)ug, or (s)uicide\\n");
974     if(tourn->params.variant == 'w')
975       gMamer.XServerCom(" %18s %4d %s", 
976                         "(W)ild Type: ", 
977                         tourn->params.wild, "(0), (1), (2), (3), (4), (5), (8), (9)8a, (10)fr\\n");
978     gMamer.XServerCom(" %18s %4d %s", "Rating (L)ow: ", tourn->params.ratingLow, "\\n");
979     gMamer.XServerCom(" %18s %4d %s", "Rating (H)igh: ", tourn->params.ratingHigh, "\\n\\n");
980     gMamer.XServerCom(" %18s %-18s %s", "Manager: ", tourn->manager, "\\n\n");
981   } else {
982     gMamer.TellUser(NotFound, user->name, "tourney");
983   }
984
985   return 1;
986 }//- End ListTourneyVars
987
988 //- MessageManagers -----------------------------------------------------
989 int CommandEntry::MessageManagers(User *user, param_list params) {
990     int i, level, tourneys;
991     long last;
992     char filename[256], manager[NAMELEN];
993     FILE *theFile;
994     
995     i = 1;
996     level = params[0].type;
997     sprintf(filename, "%s/managers", gMamer.dataFilePath);
998     if((theFile = fopen(filename, "r"))) {
999       while(fscanf(theFile, "%s %d %d %ld", manager, &level, &tourneys, &last) > 0) {
1000         gMamer.XServerCom("%s %s %s %s", "message", manager, params[0].val.string, "\n");
1001       }
1002       fclose(theFile);
1003       
1004       return(1);
1005     }
1006     gMamer.TellUser(NotFound, user->name, "Manager List");
1007     return(0);
1008 }//- MessageManagers
1009
1010 //- SetResult ------------------------------------------------------------
1011 int CommandEntry::SetResult(User *user, param_list params) {
1012   Tourney *t;
1013   int result, return_val = 0;
1014   char answer[128];
1015
1016   t = gMamer.FindTourney(params[0].val.integer);
1017   
1018   if(NULL != t) {
1019     switch (params[3].type) {    // try and set the result
1020     case TYPE_INT:
1021       switch(params[3].val.integer) {
1022         case 1: result = 1; break;
1023         case 0: result = 0; break;
1024
1025       }
1026       break;
1027     case TYPE_WORD:
1028       if(!strcmp("=", params[3].val.word)) { result = 2;
1029       } else if(!strcmp("draw", params[3].val.word)) { result = 2;
1030       } else if(!strcmp("win", params[3].val.word)) { result = 1;
1031       } else if(!strcmp("white", params[3].val.word)) { result = 1;
1032       } else if(!strcmp("loss", params[3].val.word)) { result = 0;
1033       } else if(!strcmp("black", params[3].val.word)) { result = 0;
1034       } else { 
1035         gMamer.TellUser(GameResultNotFound, user->name, params[3].val.word); 
1036         return 0;
1037       }
1038       break;
1039     default:
1040       gMamer.TellUser(GameResultNotFound, user->name, params[3].val.string); 
1041       return 0;
1042       break;
1043     }
1044     return_val = t->SetGameResult(params[1].val.word, params[2].val.word, result);
1045   }
1046   switch (return_val) {
1047   case 0:
1048     sprintf(answer, "a game with %s as white and %s as black", params[1].val.word, params[2].val.word);
1049     gMamer.TellUser(NotFound, user->name, answer);
1050     break;
1051   default:
1052     gMamer.TellUser(GameResultSet, user->name, params[1].val.word, params[2].val.word, result);
1053     switch (result) {
1054     case 1:
1055       sprintf(answer, "1-0");
1056       break;
1057     case 0:
1058       sprintf(answer, "0-1");
1059       break;
1060     default:
1061       sprintf(answer, "1/2-1/2");
1062       break;
1063     }
1064     gMamer.XServerCom("%s %d The game %s vs. %s in tourney #%d has been set %s by %s\n", "tell", gMamer.channelNumber,
1065                       params[1].val.word, params[2].val.word, t->number, answer, user->name);
1066     break;
1067   }
1068   return return_val;
1069 }//- End of SetResult
1070
1071 //- SetTourneyVariable -----------------------------------------------------
1072 int CommandEntry::SetTourneyVariable(User *user, param_list params) {
1073   Tourney *tourn = NULL;
1074   int i=0;
1075   char which_var[16];
1076   strings varAliases[] = {
1077     {"time", 0},      {"t", 0}, {"inc", 1},        {"i", 1}, {"rounds", 2}, {"r", 2},
1078     {"style", 3},     {"s", 3}, {"variant", 4},    {"v", 4}, {"mode", 5},   {"m", 5},
1079     {"wild", 6}, {"w", 6},
1080     {"ratingLow", 7}, {"l", 7}, {"ratingHigh", 8}, {"h", 8}, {"maxplayers", 9}, {"p", 9}, {NULL} };
1081
1082   tourn = gMamer.FindTourney(params[0].val.integer);   // what tourney are we talking about
1083   if(NULL == tourn) {
1084     gMamer.TellUser(NotFound, user->name, "tourney");  // wrong tourney number
1085     return 0;
1086   }
1087   if(FALSE == tourn->IsNotClosed()) {
1088     gMamer.TellUser(TourneyClosed, user->name, params[0].val.integer);
1089     return 0;
1090   }
1091   if(TRUE == tourn->IsNotNew()) {
1092     if((0 != strncasecmp(params[1].val.word, "rounds", strlen(params[1].val.word))) &&  // even if it is open
1093        (0 != strncasecmp(params[1].val.word, "r", strlen(params[1].val.word))) &&       // we can still change rounds
1094        (0 != strncasecmp(params[1].val.word, "maxplayers", strlen(params[1].val.word))) &&   // or max players
1095        (0 != strncasecmp(params[1].val.word, "p", strlen(params[1].val.word))) &&   // 
1096        (0 != strncasecmp(params[1].val.word, "style", strlen(params[1].val.word))) &&   // or style (rr) to (ss)
1097        (0 != strncasecmp(params[1].val.word, "s", strlen(params[1].val.word)))) {
1098       gMamer.TellUser(TourneyNotNew, user->name, params[0].val.integer);
1099       return(0);
1100     }
1101   }
1102   if(strcasecmp(user->name, tourn->manager) != 0) {
1103     gMamer.TellUser(NoPermissions, user->name, params[0].val.integer);
1104     return(0);
1105   }
1106   while(varAliases[i].string != NULL) {
1107     if (!(strcasecmp(varAliases[i].string, params[1].val.word))) {   //lets check the vars
1108       if(strlen(varAliases[i].string) == 1)
1109         strcpy(which_var, varAliases[i-1].string);                   
1110       else                                                       //copy the whole word
1111         strcpy(which_var, varAliases[i].string);
1112       
1113       if((varAliases[i].number <= 2) || (varAliases[i].number >= 6)) 
1114         if(params[2].type == TYPE_INT) {                     // if var is one that should be int
1115           tourn->SetVariable(varAliases[i].number, params[2].val.integer);
1116           gMamer.TellUser(ChangedInfo, user->name, which_var, params[2].val.integer);
1117           return 1;
1118         } else {
1119           gMamer.TellUser(CanNotChange, user->name, which_var, params[2].val.word);
1120           return 0;
1121         }
1122       else 
1123         if(params[2].type == TYPE_WORD) {
1124           tourn->SetVariable(varAliases[i].number, params[2].val.word);
1125           gMamer.TellUser(ChangedInfo, user->name, which_var, params[2].val.word);
1126           return 1;
1127         } else {
1128           gMamer.TellUser(CanNotChange, user->name, which_var, params[2].val.integer);
1129           return 0;
1130         }
1131     }
1132     i++;
1133   }
1134
1135   gMamer.TellUser(NotFound, user->name, params[1].val.word);  // Bad Variable  
1136   return 0;
1137 }
1138
1139 //- ShutdownCommand ----------------------------------------------------------
1140 int CommandEntry::Shutdown(User *user, param_list params) {
1141   int i;
1142
1143   i = params[0].type;
1144   i = user->GetManagerLevel();
1145
1146   gMamer.Shutdown();
1147   exit(0);
1148   
1149   return(1);
1150 } //- end of Shutdown