示例#1
0
        public static async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log)
        {
            var rconPayload = await new RequestParser(req).GetRconPayload();

            // check payload
            if (rconPayload.IsValid == null)
            {
                return(new UnauthorizedResult());
            }
            if (!rconPayload.IsValid.Value)
            {
                return(new BadRequestResult());
            }
            if (String.IsNullOrWhiteSpace(rconPayload.Parameter[0]))
            {
                return(new OkObjectResult("Oops! You must provide a parameter to be executed e.g. `map de_dust2`."));
            }

            // authorize
            var context           = new CosmosDbContext();
            var connectionPayload = await context.GetConnection(rconPayload);

            if (connectionPayload == null)
            {
                return(new UnauthorizedResult());
            }

            // execute
            try
            {
                // instantiate client and execute command
                var rconClient = await new RconService(connectionPayload, context).GetClient();
                var mapList    = await RconHelper.GetMaps(rconClient);

                var map = mapList.FirstOrDefault(x => x.Contains(rconPayload.Parameter[0].ToLower()));

                if (string.IsNullOrEmpty(map))
                {
                    return(new OkObjectResult($"Oops! Couldn't find map {rconPayload.Parameter[0]} on server. :flushed:"));
                }

                var result = await rconClient.ExecuteCommandAsync("changelevel " + rconPayload.Parameter[0]);

                return(new OkObjectResult(result));
            }
            catch (System.Exception ex)
            {
                log.LogError(ex.Message);
                return(new OkObjectResult("Oops! Server did not respond. :flushed:"));
            }
        }
示例#2
0
        public static async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log)
        {
            var rconPayload = await new RequestParser(req).GetRconPayload();

            // check payload
            if (rconPayload.IsValid == null)
            {
                return(new UnauthorizedResult());
            }
            if (!rconPayload.IsValid.Value)
            {
                return(new BadRequestResult());
            }
            if (String.IsNullOrWhiteSpace(rconPayload.Parameter[0]))
            {
                return(new OkObjectResult("Oops! You must provide a parameter to be executed e.g. `gravity pluto`."));
            }

            // authorize
            var context           = new CosmosDbContext();
            var connectionPayload = await context.GetConnection(rconPayload);

            if (connectionPayload == null)
            {
                return(new UnauthorizedResult());
            }

            // execute
            try
            {
                // instantiate client and execute command
                var          rconClient = await new RconService(connectionPayload, context).GetClient();
                var          result     = "Oops! Allowed values for `gravity` are: " + string.Join(", ", Enum.GetNames(typeof(GravityTypes))) + ".";
                GravityTypes gravityType;
                if (Enum.TryParse(rconPayload.Parameter[0].ToLower(), true, out gravityType))
                {
                    result = await rconClient.ExecuteCommandAsync("sv_gravity " + (int)gravityType);
                }
                return(new OkObjectResult(result));
            }
            catch (System.Exception ex)
            {
                log.LogError(ex.Message);
                return(new OkObjectResult("Oops! Server did not respond. :flushed:"));
            }
        }
示例#3
0
        public static async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log)
        {
            var rconPayload = await new RequestParser(req).GetRconPayload();

            // check payload
            if (rconPayload.IsValid == null)
            {
                return(new UnauthorizedResult());
            }
            if (!rconPayload.IsValid.Value)
            {
                return(new BadRequestResult());
            }
            if (String.IsNullOrWhiteSpace(rconPayload.Parameter[0]))
            {
                return(new OkObjectResult("Oops! You must provide a parameter to be executed e.g. `headshotonly 1`."));
            }

            // authorize
            var context           = new CosmosDbContext();
            var connectionPayload = await context.GetConnection(rconPayload);

            if (connectionPayload == null)
            {
                return(new UnauthorizedResult());
            }

            // execute
            try
            {
                // instantiate client and execute command
                var rconClient = await new RconService(connectionPayload, context).GetClient();
                if (rconPayload.Parameter[0] == "0" || rconPayload.Parameter[0].ToLower() == "off" ||
                    rconPayload.Parameter[0].ToLower() == "false" || rconPayload.Parameter[0].ToLower() == "no")
                {
                    return(new OkObjectResult(await rconClient.ExecuteCommandAsync("mp_damage_headshot_only 0")));
                }

                return(new OkObjectResult(await rconClient.ExecuteCommandAsync("mp_damage_headshot_only 0")));
            }
            catch (System.Exception ex)
            {
                log.LogError(ex.Message);
                return(new OkObjectResult("Oops! Server did not respond. :flushed:"));
            }
        }
示例#4
0
        public static async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log)
        {
            var rconPayload = await new RequestParser(req).GetRconPayload();

            // check payload
            if (rconPayload.IsValid == null)
            {
                return(new UnauthorizedResult());
            }
            if (!rconPayload.IsValid.Value)
            {
                return(new BadRequestResult());
            }
            if (String.IsNullOrWhiteSpace(rconPayload.Parameter[0]))
            {
                return(new OkObjectResult("Oops! You must provide a parameter to be executed e.g. `pistolonly 1`."));
            }

            // authorize
            var context           = new CosmosDbContext();
            var connectionPayload = await context.GetConnection(rconPayload);

            if (connectionPayload == null)
            {
                return(new UnauthorizedResult());
            }

            // execute
            try
            {
                // instantiate client and execute command
                var rconClient = await new RconService(connectionPayload, context).GetClient();
                if (rconPayload.Parameter[0] == "0" || rconPayload.Parameter[0].ToLower() == "off" ||
                    rconPayload.Parameter[0].ToLower() == "false" || rconPayload.Parameter[0].ToLower() == "no")
                {
                    return(new OkObjectResult(await rconClient.ExecuteCommandAsync("mp_maxmoney 16000;mp_startmoney 800;mp_afterroundmoney 0;mp_overtime_startmoney 10000; bot_pistols_only 0; mp_dm_bonus_length_max 30; sv_infinite_ammo 0; mp_weapons_allow_heavy -1; mp_weapons_allow_pistols -1; mp_weapons_allow_rifles -1; mp_weapons_allow_smgs -1;")));
                }

                return(new OkObjectResult(await rconClient.ExecuteCommandAsync("mp_maxmoney 700; mp_startmoney 700; mp_afterroundmoney 700; mp_overtime_startmoney 700; bot_pistols_only 1; mp_dm_bonus_length_max 0; sv_infinite_ammo 2; mp_weapons_allow_heavy 0; mp_weapons_allow_pistols -1; mp_weapons_allow_rifles 0; mp_weapons_allow_smgs 0;")));
            }
            catch (System.Exception ex)
            {
                log.LogError(ex.Message);
                return(new OkObjectResult("Oops! Server did not respond. :flushed:"));
            }
        }
示例#5
0
        public static async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log)
        {
            var rconPayload = await new RequestParser(req).GetRconPayload();

            // check payload
            if (rconPayload.IsValid == null)
            {
                return(new UnauthorizedResult());
            }
            if (!rconPayload.IsValid.Value)
            {
                return(new BadRequestResult());
            }
            if (String.IsNullOrWhiteSpace(rconPayload.Parameter[0]))
            {
                return(new OkObjectResult("Oops! You must provide a parameter to be executed e.g. `rcon mp_restartgame 1;`.\nFor more details, please have a look here: https://totalcsgo.com/commands"));
            }

            // authorize
            var context           = new CosmosDbContext();
            var connectionPayload = await context.GetConnection(rconPayload);

            if (connectionPayload == null)
            {
                return(new UnauthorizedResult());
            }

            // execute
            try
            {
                // instantiate client and execute command
                var rconClient  = await new RconService(connectionPayload, context).GetClient();
                var rconCommand = string.Join(" ", rconPayload.Parameter);
                return(new OkObjectResult(await rconClient.ExecuteCommandAsync(rconCommand, true)));
            }
            catch (System.Exception ex)
            {
                log.LogError(ex.Message);
                return(new OkObjectResult("Oops! Server did not respond. :flushed:"));
            }
        }
示例#6
0
        public static async Task <IActionResult> Run3([HttpTrigger(AuthorizationLevel.Function, "delete", Route = "connect")] HttpRequest req, ILogger log)
        {
            var context     = new CosmosDbContext();
            var rconPayload = await new RequestParser(req).GetRconPayload();
            // authorize
            var connectionPayload = await context.GetConnection(rconPayload);

            if (connectionPayload == null)
            {
                return(new UnauthorizedResult());
            }
            if (rconPayload.Parameter.Length > 0 &&
                rconPayload.Parameter[0] == "all")
            {
                await context.DeleteConnections(rconPayload.AccessToken);
            }
            else
            {
                await context.DeleteConnection(connectionPayload);
            }
            return(new OkObjectResult("00,OK,00,00"));
        }
示例#7
0
        public static async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log)
        {
            var rconPayload = await new RequestParser(req).GetRconPayload();

            // check payload
            if (rconPayload.IsValid == null)
            {
                return(new UnauthorizedResult());
            }
            if (!rconPayload.IsValid.Value)
            {
                return(new BadRequestResult());
            }

            // authorize
            var context           = new CosmosDbContext();
            var connectionPayload = await context.GetConnection(rconPayload);

            if (connectionPayload == null)
            {
                return(new UnauthorizedResult());
            }

            // execute
            try
            {
                // instantiate client and execute command
                var rconClient = await new RconService(connectionPayload, context).GetClient();
                var result     = await rconClient.ExecuteCommandAsync("status");

                return(new OkObjectResult(result));
            }
            catch (System.Exception ex)
            {
                log.LogError(ex.Message);
                return(new OkObjectResult("Oops! Server did not respond. :flushed:"));
            }
        }
示例#8
0
        public static async Task <IActionResult> Run2([HttpTrigger(AuthorizationLevel.Function, "post", Route = "connect")] HttpRequest req, ILogger log)
        {
            var context           = new CosmosDbContext();
            var connectionPayload = await new RequestParser(req).GetConnectionPayload();

            // check payload
            if (connectionPayload.IsValid == null)
            {
                return(new UnauthorizedResult());
            }
            if (!connectionPayload.IsValid.Value)
            {
                return(new BadRequestResult());
            }
            if (!isAccessTokenValid(connectionPayload.AccessToken))
            {
                return(new BadRequestResult());
            }
            // upsert connection
            await context.SetConnection(connectionPayload);

            return(new OkObjectResult("00,OK,00,00"));
        }
示例#9
0
        public static async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = "connect")] HttpRequest req, ILogger log)
        {
            var context     = new CosmosDbContext();
            var rconPayload = await new RequestParser(req).GetRconPayload();

            if (req.ContentType.ToLower() != "application/json")
            {
                return(new BadRequestResult());
            }
            // check payload
            if (rconPayload.IsValid == null)
            {
                return(new UnauthorizedResult());
            }
            if (!rconPayload.IsValid.Value)
            {
                return(new BadRequestResult());
            }
            // authorize
            var resultObject = await context.GetConnection(rconPayload);

            return(new OkObjectResult(resultObject));
        }
示例#10
0
 public RconService(ConnectionPayload connection, CosmosDbContext context)
 {
     this.connection = connection;
     this.context    = context;
 }
示例#11
0
        public static async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log)
        {
            var rconPayload = await new RequestParser(req).GetRconPayload();

            // check payload
            if (rconPayload.IsValid == null)
            {
                return(new UnauthorizedResult());
            }
            if (!rconPayload.IsValid.Value)
            {
                return(new BadRequestResult());
            }
            if (String.IsNullOrWhiteSpace(rconPayload.Parameter[0]))
            {
                return(new OkObjectResult("Oops! You must provide a parameter to be executed e.g. `mode wingman`."));
            }

            // authorize
            var context           = new CosmosDbContext();
            var connectionPayload = await context.GetConnection(rconPayload);

            if (connectionPayload == null)
            {
                return(new UnauthorizedResult());
            }

            // execute
            try
            {
                // instantiate client and execute command
                var rconClient = await new RconService(connectionPayload, context).GetClient();
                var result     = "Oops! Allowed game types are: " + string.Join(", ", Enum.GetNames(typeof(GameTypes))) + ".";

                GameTypes gameType;
                if (!Enum.TryParse(rconPayload.Parameter[0].ToLower(), true, out gameType))
                {
                    return(new OkObjectResult(result));
                }

                // Get map pool from server
                var mapList = await RconHelper.GetMaps(rconClient);

                // Set random map that suits the given type or use parameter value(s)
                var currentMap = String.Empty;
                if (rconPayload.Parameter.Length < 2)
                {
                    currentMap = getRandomMapByGameType(mapList, gameType);
                }
                else if (rconPayload.Parameter.Length > 1)
                {
                    // exact match
                    currentMap = mapList.FirstOrDefault(x => x == rconPayload.Parameter[1].ToLower());
                    // starts with
                    if (string.IsNullOrEmpty(currentMap))
                    {
                        currentMap = mapList.FirstOrDefault(x => x.StartsWith(rconPayload.Parameter[1].ToLower()));
                    }
                    // ends with
                    if (string.IsNullOrEmpty(currentMap))
                    {
                        currentMap = mapList.FirstOrDefault(x => x.EndsWith(rconPayload.Parameter[1].ToLower()));
                    }
                    // contains -> Warning: could also load de_dust2_se if de_dust2 is parameter
                    if (string.IsNullOrEmpty(currentMap))
                    {
                        currentMap = mapList.FirstOrDefault(x => x.Contains(rconPayload.Parameter[1].ToLower()));
                    }
                    // Todo: Fuzzy search? ... No, just kidding. ;-)
                }

                if (string.IsNullOrEmpty(currentMap))
                {
                    return(new OkObjectResult($"Oops! Couldn't find map on server... :flushed:"));
                }

                // Set mapgroup by parameter or match currentmap
                var currentMapGroup = rconPayload.Parameter.Length > 2 ?
                                      rconPayload.Parameter[2].ToLower() :
                                      "mg_" + (currentMap.Contains("workshop") ? currentMap.Split('/')[2] : currentMap);

                // switch game to chosen type and map
                if (gameType == GameTypes.casual)
                {
                    var resp = await rconClient.ExecuteCommandAsync($"game_type 0; game_mode 0; exec gamemode_casual; map {currentMap}; mapgroup {currentMapGroup};");

                    return(new OkObjectResult($"Switched server to mode 'Casual'.\n{resp}"));
                }
                if (gameType == GameTypes.competitive)
                {
                    var resp = await rconClient.ExecuteCommandAsync($"game_type 0; game_mode 1; exec gamemode_competitive; map {currentMap}; mapgroup {currentMapGroup};");

                    return(new OkObjectResult($"Switched server to mode 'Competitive'.\n{resp}"));
                }
                if (gameType == GameTypes.wingman)
                {
                    var resp = await rconClient.ExecuteCommandAsync($"game_type 0; game_mode 2; exec gamemode_competitive2v2; map {currentMap}; mapgroup {currentMapGroup};");

                    return(new OkObjectResult($"Switched server to mode 'Wingman'.\n{resp}"));
                }
                if (gameType == GameTypes.dangerzone)
                {
                    var resp = await rconClient.ExecuteCommandAsync($"game_type 6; game_mode 0; exec gamemode_survival; map {currentMap}; mapgroup {currentMapGroup};");

                    return(new OkObjectResult($"Switched server to mode 'Dangerzone'.\n{resp}"));
                }
                if (gameType == GameTypes.armsrace)
                {
                    var resp = await rconClient.ExecuteCommandAsync($"game_type 1; game_mode 0; exec gamemode_armsrace; map {currentMap}; mapgroup {currentMapGroup};");

                    return(new OkObjectResult($"Switched server to mode 'Armsrace'.\n{resp}"));
                }
                if (gameType == GameTypes.deathmatch)
                {
                    var resp = await rconClient.ExecuteCommandAsync($"game_type 1; game_mode 2; exec op08_bounty_hunter; map {currentMap}; mapgroup {currentMapGroup};");

                    return(new OkObjectResult($"Switched server to mode 'Deathmatch'.\n{resp}"));
                }
                if (gameType == GameTypes.teamdeathmatch)
                {
                    var resp = await rconClient.ExecuteCommandAsync($"game_type 1; game_mode 2; exec gamemode_teamdeathmatch; map {currentMap}; mapgroup {currentMapGroup};");

                    return(new OkObjectResult($"Switched server to mode 'Team Deathmatch'.\n{resp}"));
                }

                return(new OkObjectResult("Oops! That didn't work... :flushed:"));
            }
            catch (System.Exception ex)
            {
                log.LogError(ex.Message);
                return(new OkObjectResult("Oops! Server did not respond. :flushed:"));
            }
        }