PageRenderTime 23ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/trunk/AwpAdminConsole/Program.cs

http://bf3admin.codeplex.com
C# | 237 lines | 190 code | 38 blank | 9 comment | 30 complexity | 84818d773268de4ffa5132b06e759f92 MD5 | raw file
Possible License(s): GPL-2.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using AwpAdminTool;
  6. using System.Net.Battlefield3;
  7. using System.IO;
  8. using Microsoft.VisualBasic.FileIO;
  9. namespace AwpAdminConsole
  10. {
  11. class Program
  12. {
  13. static AwpAdmin AdminClient;
  14. static StreamWriter logger;
  15. static void Main(string[] args)
  16. {
  17. Write("AwpAdmin Launching.");
  18. AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
  19. bool autoConnect = false;
  20. //check args
  21. if (args.Length > 0)
  22. {
  23. for (int i = 0; i < args.Length; i++)
  24. {
  25. switch (args[i])
  26. {
  27. case "-settings":
  28. if (args.Length > i + 1) //next arg exists
  29. {
  30. i++; //increment because reading to next arg
  31. if (Directory.Exists(args[i]))
  32. AdminClient = new AwpAdmin(args[i]);
  33. }
  34. break;
  35. case "-autoconnect":
  36. autoConnect = true;
  37. break;
  38. }
  39. }
  40. }
  41. if (AdminClient == null) AdminClient = new AwpAdmin(); //default dir
  42. //set title
  43. Console.Title = string.Format("AwpAdmin {0}: {1}:{2}",
  44. System.Reflection.Assembly.GetExecutingAssembly().GetName().Version, AdminClient.Client.Address, AdminClient.Client.Port);
  45. //events
  46. AdminClient.Client.Connected += new EventHandler(Client_Connected);
  47. AdminClient.Client.LoggedOn += new EventHandler(Client_LoggedOn);
  48. AdminClient.Client.ConnectError += new EventHandler<ConnectErrorEventArgs>(Client_ConnectError);
  49. AdminClient.Client.Disconnected += new EventHandler<DisconnectedEventArgs>(Client_Disconnected);
  50. AdminClient.Client.PlayerChat += new EventHandler<PlayerChatEventArgs>(Client_PlayerChat);
  51. AdminClient.Client.PunkBusterMessage += new EventHandler<PunkBusterMessageEventArgs>(Client_PunkBusterMessage);
  52. //logger
  53. logger = new StreamWriter(AdminClient.WorkingDirectory + "log.txt", true);
  54. if (autoConnect)
  55. {
  56. Write("Connecting to server.");
  57. AdminClient.Client.Connect();
  58. }
  59. Write("Launched.");
  60. //read loop
  61. //this code is just temporary in order to get a version of AWP. dont worry about validation for now
  62. string line = "";
  63. while (line != "exit")
  64. {
  65. line = Console.ReadLine();
  66. if (line == "") continue;
  67. TextFieldParser parser = new TextFieldParser(new StringReader(line))
  68. {
  69. HasFieldsEnclosedInQuotes = true,
  70. Delimiters = new string[] { " ", "\t" }
  71. };
  72. string[] fields = parser.ReadFields();
  73. if (AdminClient.Client.IsLoggedOn)
  74. {
  75. switch (fields[0])
  76. {
  77. case "players":
  78. if (AdminClient.Client.Players.Count == 0)
  79. {
  80. Write("No players.");
  81. break;
  82. }
  83. PlayerCollection players = AdminClient.Client.Players;
  84. foreach (var p in players)
  85. {
  86. Write("Name: {0} || Team: {1} || Admin: {2}", p.Name, p.TeamId, p.IsAdmin());
  87. }
  88. Write("{0} total players.", players.Count());
  89. break;
  90. case "setadmin":
  91. PlayerCollection players2 = AdminClient.Client.Players;
  92. if (players2.PlayerExists(fields[1]))
  93. {
  94. Player p = players2[fields[1]];
  95. p.GetAdmin().Rank = Convert.ToInt32(fields[2]);
  96. }
  97. else Write("{0} not found.", fields[1]);
  98. break;
  99. case "setcommand":
  100. AdminClient.SetCommandAccessLevel(fields[1], Convert.ToInt32(fields[2]));
  101. break;
  102. case "getcommand": //get commands are here for debugging namespaces
  103. Write("{0} Access Level: {1}", fields[1], AdminClient.GetCommandAccessLevel(fields[1]));
  104. break;
  105. case "getadmin":
  106. PlayerCollection players3 = AdminClient.Client.Players;
  107. if (players3.PlayerExists(fields[1]))
  108. {
  109. Write("{0} Admin Rank: {1}", fields[1], players3[fields[1]].GetAdmin().Rank);
  110. }
  111. else Write("{0} not found.", fields[1]);
  112. break;
  113. case "assemblies":
  114. foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
  115. {
  116. Write("Assembly: {0}", a.FullName);
  117. }
  118. break;
  119. case "say":
  120. AdminClient.Client.SendRequest("admin.say", "[Console] " + string.Join(" ", fields, 1, fields.Length - 1), "all");
  121. break;
  122. case "plugins":
  123. StringBuilder plugins = new StringBuilder();
  124. foreach (var p in AdminClient.Plugins.Plugins.Keys)
  125. {
  126. plugins.AppendFormat("{0}, ", p);
  127. }
  128. Write("Plugins: {0}", plugins.ToString());
  129. break;
  130. }
  131. }
  132. else if (fields[0] == "connect") AdminClient.Client.Connect();
  133. }
  134. }
  135. static void Client_PlayerChat(object sender, PlayerChatEventArgs e)
  136. {
  137. Write("[{0}] {1}", e.Player == null ? "Admin" : e.Player.Name, e.Message);
  138. }
  139. static void Client_PunkBusterMessage(object sender, PunkBusterMessageEventArgs e)
  140. {
  141. Write(e.Message.TrimEnd('\r', '\n'));
  142. }
  143. static void Client_Connected(object sender, EventArgs e)
  144. {
  145. Write("Connected");
  146. }
  147. static void Client_Disconnected(object sender, DisconnectedEventArgs e)
  148. {
  149. if (e.SocketError == System.Net.Sockets.SocketError.Success)
  150. {
  151. Write("Disconnected.");
  152. }
  153. else
  154. {
  155. Write("Disconnected through SocketException ({0}): {1}", e.SocketError, e.Message);
  156. }
  157. AdminClient.Client.Connect();
  158. }
  159. static void Client_ConnectError(object sender, ConnectErrorEventArgs e)
  160. {
  161. Write("Connection Error Code {0}: {1}", e.SocketError, e.Message);
  162. Environment.Exit(0);
  163. }
  164. static void Client_LoggedOn(object sender, EventArgs e)
  165. {
  166. Write("Logged on.");
  167. }
  168. //if the logger isnt up, store messages
  169. static Queue<string> messages = new Queue<string>();
  170. static void Write(string format, params object[] arg)
  171. {
  172. string timeStamp = string.Format("[{0}] ", DateTime.Now.ToString("T"));
  173. Console.Write(timeStamp);
  174. Console.WriteLine(format, arg);
  175. //check message queue
  176. if (messages.Count > 0)
  177. {
  178. foreach (var m in messages)
  179. {
  180. logger.WriteLine(m);
  181. }
  182. messages.Clear();
  183. }
  184. //log to file:
  185. if (logger != null)
  186. {
  187. logger.Write(timeStamp);
  188. logger.WriteLine(format, arg);
  189. logger.Flush();
  190. }
  191. else messages.Enqueue(timeStamp + string.Format(format, arg));
  192. }
  193. static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
  194. {
  195. Write("An unhandled exception has occurred:");
  196. Write(e.ExceptionObject.ToString());
  197. }
  198. }
  199. }