private static ServerEvent ParseByNamedRegex(RefreshPacket refreshPacket, string input, string regexWithNamedGroups, EventType eventType) { var regex = new Regex(regexWithNamedGroups); var match = regex.Match(input); if (!match.Success) { return(null); } var props = regex.GetGroupNames() .Except(new [] { "0" }) .Select(name => (name, match.Groups[(string)name].Value)) .ToArray(); return(new ServerEvent(refreshPacket, eventType, props)); }
public static ServerEvent Parse(string input, RefreshPacket refreshPacket) { if (refreshPacket?.PlayerName == null) { return(ServerEvent.NoRefreshFrame(input)); } Func <RefreshPacket, string, ServerEvent>[] handlers = { ParsePlayerLeavesTeam, ParsePlayerSays, ParseAddressIsRequestingGame, ParsePlayerJoiningGame, ParsePlayerJoinsTeam, ParsePlayerKillsPlayer, ParsePlayerCapturesFlag, ParsePlayerReturnsFlag, ParsePlayerScoresForTeam, ParseNextMap, ParseTimeLeft, ParseCommandRequest, }; foreach (var handler in handlers) { var result = handler(refreshPacket, input); if (result == null) { continue; } if (PlayerNameMatches(result, refreshPacket.PlayerName)) { return(result); } else { Console.WriteLine($"Tried {result.EventType} but player name doesn't match"); } } return(ServerEvent.Unknown(input)); }
public RefreshPacket ParseRefreshPacket(byte[] packet, int offset = 0) { int i = offset; byte length; RefreshPacket tempPacket = new RefreshPacket(); for (int k = 0; k < 32; k++) { length = packet[i]; i++; for (int j = 0; j < 24; j++) { tempPacket.PlayerName[k] += Convert.ToChar(packet[i]); i++; } tempPacket.PlayerName[k] = left(tempPacket.PlayerName[k], length); } for (int k = 0; k < 32; k++) { tempPacket.Team[k] = packet[i]; i++; } for (int k = 0; k < 32; k++) { tempPacket.Kills[k] = packet[i] + (packet[i + 1] * 256); i += 2; } for (int k = 0; k < 32; k++) { tempPacket.Deaths[k] = packet[i] + (packet[i + 1] * 256); i += 2; } for (int k = 0; k < 32; k++) { tempPacket.Ping[k] = packet[i]; i++; } for (int k = 0; k < 32; k++) { tempPacket.Number[k] = packet[i]; i++; } for (int k = 0; k < 32; k++) { for (int j = 0; j < 4; j++) { tempPacket.IP[k, j] = packet[i]; i++; } } for (int k = 0; k < 4; k++) { tempPacket.TeamScore[k] = packet[i] + (packet[i + 1] * 256); i += 2; } length = packet[i]; i++; for (int k = 0; k < 16; k++) { tempPacket.MapName += Convert.ToChar(packet[i]); i++; } tempPacket.MapName = left(tempPacket.MapName, length); for (int k = 0; k < 4; k++) { //You can use getTime() to return the time limit as a string in "MM:SS" format. tempPacket.TimeLimit += Convert.ToInt64(packet[i] * (Math.Pow(256, k))); i++; } for (int k = 0; k < 4; k++) { //You can use getTime() to return the time left as a string in "MM:SS" format. tempPacket.CurrentTime += Convert.ToInt64(packet[i] * (Math.Pow(256, k))); i++; } tempPacket.KillLimit = packet[i] + (packet[i + 1] * 256); i += 2; tempPacket.GameStyle = packet[i]; return(tempPacket); }
public ServerEvent(RefreshPacket refreshPacket, EventType type, params (string, string)[] props)
private static ServerEvent ParseAddressIsRequestingGame(RefreshPacket refreshPacket, string input) => ParseByNamedRegex( refreshPacket, input, @"(?<address>[\d\.:]+)\|(?<hwid>[a-zA-Z0-9]+) requesting game\.\.\.", EventType.AddressIsRequestingGame);
private static ServerEvent ParseTimeLeft(RefreshPacket refreshPacket, string input) => ParseByNamedRegex( refreshPacket, input, @"^Time Left: (?<timeleft>.+)", EventType.TimeLeft);
private static ServerEvent ParseNextMap(RefreshPacket refreshPacket, string input) => ParseByNamedRegex( refreshPacket, input, @"Next map: (?<map>.+)", EventType.NextMap);
private static ServerEvent ParseCommandRequest(RefreshPacket refreshPacket, string input) => ParseByNamedRegex( refreshPacket, input, @"^\/(?<command>\w+?)\((?<ip>[\d\.]+)\[(?<name>.+?)\]\)", EventType.CommandRequest);
private static ServerEvent ParsePlayerScoresForTeam(RefreshPacket refreshPacket, string input) => ParseByNamedRegex( refreshPacket, input, @"(?<name>.+) scores for (?<team>\w+) Team", EventType.PlayerScoresForTeam);
private static ServerEvent ParsePlayerSays(RefreshPacket refreshPacket, string input) => ParseByNamedRegex( refreshPacket, input, @"^\[(?<name>.+?)\] (?<what>.+)$", EventType.PlayerSays);
private static ServerEvent ParsePlayerReturnsFlag(RefreshPacket refreshPacket, string input) => ParseByNamedRegex( refreshPacket, input, @"(?<name>.+) returned the (?<flag>\w+) Flag", EventType.PlayerReturnsFlag);
private static ServerEvent ParsePlayerKillsPlayer(RefreshPacket refreshPacket, string input) => ParseByNamedRegex( refreshPacket, input, @"\((?<killerindex>\d+?)\) (?<killer>.+) killed \((?<victimindex>\d+?)\) (?<victim>.+) with (?<weapon>.+)", EventType.PlayerKillsPlayer);
private static ServerEvent ParsePlayerLeavesTeam(RefreshPacket refreshPacket, string input) => ParseByNamedRegex( refreshPacket, input, @"(?<formername>.+) has left (?<team>\w+) team\.", EventType.PlayerLeavesTeam);
private static ServerEvent ParsePlayerJoinsTeam(RefreshPacket refreshPacket, string input) => ParseByNamedRegex( refreshPacket, input, @"(?<name>.+) has joined (?<team>\w+) team\.", EventType.PlayerJoinsTeam);
private static ServerEvent ParsePlayerJoiningGame(RefreshPacket refreshPacket, string input) => ParseByNamedRegex( refreshPacket, input, @"(?<name>.+) joining game \((?<address>[\d\.:]+)\) HWID:(?<hwid>[a-zA-Z0-9]+)", EventType.PlayerJoiningGame);