async Task NewGame_(DiscordChannel channel, List <DisboardPlayer> players, ConcurrentQueue <Func <Task> > messageQueue, bool isDebug = false) { var disboardChannel = new DisboardChannel(channel, messageQueue, STADispatcher); var gameInitializeData = new DisboardGameInitData(isDebug, Client, disboardChannel, players, OnFinish, messageQueue); DisboardGame game = GameFactory.New(gameInitializeData); if (game.IsFinished) { return; } OnFinish(channel.Id); if (game is DisboardGameUsingDM) { var gameUsesDM = game as DisboardGameUsingDM; foreach (var player in players) { if (GamesByUsers.TryGetValue(player.Id, out var existingGame) && existingGame != game) { player.DM("`기존에 진행중이던 게임이 있습니다. 기존 게임에 다시 참여하려면 기존 채널에서 BOT restoredm을 입력하세요.`"); GamesByUsers.Remove(player.Id, out _); } GamesByUsers.TryAdd(player.Id, gameUsesDM !); } } await RunInLockAndProcessMessage(game, () => { Games.TryAdd(channel.Id, game); }, gameIsInGameList : false); }
/// <summary> /// 그룹 채널의 BOT start, BOT restart 명령어에 의해 호출됩니다. /// </summary> /// <param name="initData">게임 생성에 필요한 데이터입니다.</param> public DisboardGame(DisboardGameInitData initData) { Client = initData.Client; IsDebug = initData.IsDebug; Channel = initData.Channel; InitialPlayers = initData.Players; MessageQueue = initData.MessageQueue; Render = Channel.Render; OnFinish = () => { IsFinished = true; initData.OnFinish(initData.Channel.Id); }; }
/// <summary> /// 그룹 채널의 BOT start, BOT restart 명령어에 의해 호출됩니다. /// </summary> /// <param name="initData">게임 생성에 필요한 데이터입니다.</param> public DisboardGameUsingDM(DisboardGameInitData initData) : base(initData) { }
DisboardGame IDisboardGameFactory.New(DisboardGameInitData initData) => New(initData);
internal DisboardGame New(DisboardGameInitData initData) => (DisboardGame)Activator.CreateInstance(typeof(GameType), new[] { initData }) !;