@@ -0,0 +1,81 @@
using System;
using System.Collections.Generic;
using Microsoft.Data.Entity.Migrations;

namespace SabotageSms.Migrations
{
public partial class FixedGamePlayerRelation : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(name: "FK_DbGamePlayer_DbGame_GameId", table: "GamePlayer");
migrationBuilder.DropForeignKey(name: "FK_DbGamePlayer_DbPlayer_PlayerId", table: "GamePlayer");
migrationBuilder.DropForeignKey(name: "FK_DbMessage_DbPlayer_PlayerId", table: "Message");
migrationBuilder.DropForeignKey(name: "FK_DbRound_DbGame_GameId", table: "Round");
migrationBuilder.AddForeignKey(
name: "FK_DbGamePlayer_DbGame_GameId",
table: "GamePlayer",
column: "GameId",
principalTable: "Game",
principalColumn: "GameId",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_DbGamePlayer_DbPlayer_PlayerId",
table: "GamePlayer",
column: "PlayerId",
principalTable: "Player",
principalColumn: "PlayerId",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_DbMessage_DbPlayer_PlayerId",
table: "Message",
column: "PlayerId",
principalTable: "Player",
principalColumn: "PlayerId",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_DbRound_DbGame_GameId",
table: "Round",
column: "GameId",
principalTable: "Game",
principalColumn: "GameId",
onDelete: ReferentialAction.Cascade);
}

protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(name: "FK_DbGamePlayer_DbGame_GameId", table: "GamePlayer");
migrationBuilder.DropForeignKey(name: "FK_DbGamePlayer_DbPlayer_PlayerId", table: "GamePlayer");
migrationBuilder.DropForeignKey(name: "FK_DbMessage_DbPlayer_PlayerId", table: "Message");
migrationBuilder.DropForeignKey(name: "FK_DbRound_DbGame_GameId", table: "Round");
migrationBuilder.AddForeignKey(
name: "FK_DbGamePlayer_DbGame_GameId",
table: "GamePlayer",
column: "GameId",
principalTable: "Game",
principalColumn: "GameId",
onDelete: ReferentialAction.Restrict);
migrationBuilder.AddForeignKey(
name: "FK_DbGamePlayer_DbPlayer_PlayerId",
table: "GamePlayer",
column: "PlayerId",
principalTable: "Player",
principalColumn: "PlayerId",
onDelete: ReferentialAction.Restrict);
migrationBuilder.AddForeignKey(
name: "FK_DbMessage_DbPlayer_PlayerId",
table: "Message",
column: "PlayerId",
principalTable: "Player",
principalColumn: "PlayerId",
onDelete: ReferentialAction.Restrict);
migrationBuilder.AddForeignKey(
name: "FK_DbRound_DbGame_GameId",
table: "Round",
column: "GameId",
principalTable: "Game",
principalColumn: "GameId",
onDelete: ReferentialAction.Restrict);
}
}
}
@@ -16,6 +16,7 @@ public class DbGame
[MaxLength(120)]
public string JoinCode { get; set; }

[InverseProperty("Game")]
public virtual ICollection<DbGamePlayer> GamePlayers { get; set; }

[InverseProperty("Game")]
@@ -38,7 +39,9 @@ public class DbGame
JoinCode = JoinCode,
Players = GamePlayers?
.OrderBy(gp => gp.TurnOrder)
.Select(gp => gp.Player.ToPlayer())
.Select(gp => gp.Player)
.ToList()
.Select(p => p.ToPlayer())
.ToList(),
Rounds = Rounds?.OrderBy(r => r.RoundNumber).Select(r => r.ToRound()).ToList(),
LeaderCount = LeaderCount,
@@ -13,6 +13,7 @@ public class DbGamePlayer
public long GameId { get; set; }

[ForeignKey("GameId")]
[InverseProperty("GamePlayers")]
public virtual DbGame Game { get; set; }

public int TurnOrder { get; set; }
@@ -22,7 +22,10 @@ public EfGameDataProvider(ApplicationDbContext db)

public Game GetGameById(long gameId)
{
return _db.Games.SingleOrDefault(g => g.GameId == gameId)?.ToGame();
return _db.Games
.Include(g => g.GamePlayers)
.ThenInclude(gp => gp.Player)
.SingleOrDefault(g => g.GameId == gameId)?.ToGame();
}

public Game GetGameByJoinCode(string joinCode)
@@ -59,14 +62,20 @@ public Game GetPlayerCurrentGame(long playerId)
{
var game = _db.Players
.Include(p => p.CurrentGame)
.Include(p => p.CurrentGame.GamePlayers)
.ThenInclude(cg => cg.GamePlayers)
.ThenInclude(cgp => cgp.Player)
.SingleOrDefault(p => p.PlayerId == playerId)
.CurrentGame;
return game?.ToGame();
}

public Game CreateNewGame(long playerId)
{
var player = _db.Players.SingleOrDefault(p => p.PlayerId == playerId);
if (player == null)
{
return null;
}
var random = new Random((int)DateTime.Now.Ticks);
var joinCodeStringBuilder = new StringBuilder();
for (var i = 0; i < _joinCodeLength; i++) {
@@ -79,7 +88,7 @@ public Game CreateNewGame(long playerId)
{
new DbGamePlayer()
{
PlayerId = playerId,
Player = player,
IsBad = false
}
},
@@ -9,16 +9,113 @@ public class ParsingProvider
{
public ParsedCommand ParseCommand(Player player, string messageBody)
{
var name = new Regex("(?i)name (?<name>.+)").Match(messageBody);
if (name.Success)
var namePattern = new Regex("(?i)^name (?<name>.+)").Match(messageBody);
if (namePattern.Success)
{
return new ParsedCommand()
{
Command = Command.Name,
Parameters = name.Groups["name"].Value
Parameters = namePattern.Groups["name"].Value
};
}

var newPattern = new Regex("(?i)^new").Match(messageBody);
if (newPattern.Success)
{
return new ParsedCommand()
{
Command = Command.New,
Parameters = null
};
}

var joinPattern = new Regex("(?i)^join\\s+(?<code>[a-zA-Z0-9]+)").Match(messageBody);
if (joinPattern.Success)
{
return new ParsedCommand()
{
Command = Command.Join,
Parameters = joinPattern.Groups["code"].Value
};
}

var startPattern = new Regex("(?i)^start").Match(messageBody);
if (startPattern.Success)
{
return new ParsedCommand()
{
Command = Command.StartGame,
Parameters = null
};
}

var selectRosterPattern = new Regex("(?i)^select\\s+((?<name>[a-zA-Z0-9]+)\\s*,?\\s*)+").Match(messageBody);
if (selectRosterPattern.Success)
{
var names = selectRosterPattern.Groups["name"].Captures;
var playerNames = new string[names.Count];
for (var i = 0; i < names.Count; i++)
{
playerNames[i] = names[i].Value;
}
return new ParsedCommand()
{
Command = Command.SelectRoster,
Parameters = playerNames
};
}

var confirmPattern = new Regex("(?i)^confirm").Match(messageBody);
if (confirmPattern.Success)
{
return new ParsedCommand()
{
Command = Command.ConfirmRoster,
Parameters = null
};
}

var rejectPattern = new Regex("(?i)^reject").Match(messageBody);
if (rejectPattern.Success)
{
return new ParsedCommand()
{
Command = Command.RejectRoster,
Parameters = null
};
}

var approvePattern = new Regex("(?i)^approve").Match(messageBody);
if (approvePattern.Success)
{
return new ParsedCommand()
{
Command = Command.ApproveRoster,
Parameters = null
};
}

var passPattern = new Regex("(?i)^pass").Match(messageBody);
if (passPattern.Success)
{
return new ParsedCommand()
{
Command = Command.PassMission,
Parameters = null
};
}

var failPattern = new Regex("(?i)^fail").Match(messageBody);
if (failPattern.Success)
{
return new ParsedCommand()
{
Command = Command.FailMission,
Parameters = null
};
}

// No recognized command.
return new ParsedCommand()
{
Command = Command.Unknown,