public TeleportCityViewModel(IDispatcherService dispatcherService, string functionTag, IDialogService dialogService,
                                     ScoreInfoService scoreInfoService, CityPositionService cityPositionService, TeleRecordService teleRecordService)
            : base(dispatcherService, functionTag)
        {
            _dialogService       = dialogService;
            _scoreInfoService    = scoreInfoService;
            _cityPositionService = cityPositionService;
            _teleRecordService   = teleRecordService;

            DataGridItemChanged = new RelayCommand <DataGridItemChangedEventArgs>(OnDataGridItemChanged);

            RefreshList = new RelayCommand(PrivateRefreshList);

            RemoveItem = new RelayCommand(() =>
            {
                if (_dialogService.ShowOKCancel("确定删除选中数据吗?"))
                {
                    _ = _cityPositionService.RemoveAsync(SelectedItem);
                    CityPositions.Remove(SelectedItem);
                }
            }, () => { return(SelectedItem != null); });

            RemoveAll = new RelayCommand(() =>
            {
                if (_dialogService.ShowOKCancel("确定删除所有数据吗?"))
                {
                    _             = _cityPositionService.RemoveAllAsync();
                    CityPositions = null;
                }
            }, () => { return(CityPositions != null); });

            AddData = new RelayCommand(() =>
            {
                if (string.IsNullOrEmpty(TeleCmd))
                {
                    _dialogService.ShowInformation("传送命令不能为空");
                    return;
                }
                if (CityPositions.FirstOrDefault(p => p.TeleCmd == TeleCmd) != null)
                {
                    _dialogService.ShowInformation("传送命令重复");
                    return;
                }

                var cityPosition = new CityPositionDto()
                {
                    CityName      = CityName,
                    TeleCmd       = TeleCmd,
                    TeleNeedScore = TeleNeedScore,
                    Pos           = Pos
                };
                _ = _cityPositionService.AddAsync(cityPosition);
                CityPositions.Add(cityPosition);
            });

            AddAvailableVariables();

            PrivateRefreshList();
        }
        protected override bool OnPlayerChatHooked(PlayerInfo playerInfo, string message)
        {
            if (message == QueryListCmd)
            {
                List <CityPositionDto> dtos = _cityPositionService.GetAll("CityName ASC");

                if (dtos.Count == 0)
                {
                    SdtdConsole.Instance.SendMessageToPlayer(playerInfo.SteamID, "[00FF00]暂无公共城镇信息");
                }
                else
                {
                    SdtdConsole.Instance.SendMessageToPlayer(playerInfo.SteamID, "[00FF00]可用公共城镇:");

                    StringBuilder returnCmd = new StringBuilder();
                    int           index     = 1;
                    foreach (var item in dtos)
                    {
                        returnCmd.Append(string.Format("pm {0} \"[00FF00]{1}{2}\"\r\n", playerInfo.SteamID, index, FormatCmd(playerInfo, QueryListTips, item)));
                        ++index;
                    }
                    SdtdConsole.Instance.SendCmd(returnCmd.ToString());
                }
            }
            else
            {
                CityPositionDto cityPosition = _cityPositionService.GetDataByID(message);
                if (cityPosition == null)
                {
                    return(false);
                }
                else
                {
                    var teleRecord = _teleRecordService.GetDataByID(playerInfo.SteamID);

                    if (teleRecord != null && string.IsNullOrEmpty(teleRecord.LastTeleDateTime) == false)
                    {
                        int timeSpan = (int)(DateTime.Now - DateTime.Parse(teleRecord.LastTeleDateTime)).TotalSeconds;
                        if (timeSpan < TeleInterval)// 正在冷却
                        {
                            SdtdConsole.Instance.SendMessageToPlayer(playerInfo.SteamID, FormatCmd(playerInfo, TeleFailTips2, TeleInterval - timeSpan));

                            return(true);
                        }
                    }

                    int playerScore = _scoreInfoService.GetPlayerScore(playerInfo.SteamID);
                    if (playerScore < cityPosition.TeleNeedScore)// 积分不足
                    {
                        SdtdConsole.Instance.SendMessageToPlayer(playerInfo.SteamID, FormatCmd(playerInfo, TeleFailTips1, cityPosition));
                    }
                    else
                    {
                        _scoreInfoService.DeductPlayerScore(playerInfo.SteamID, cityPosition.TeleNeedScore);

                        SdtdConsole.Instance.TelePlayer(playerInfo.SteamID, cityPosition.Pos);

                        SdtdConsole.Instance.SendGlobalMessage(FormatCmd(playerInfo, TeleSucceedTips, cityPosition));

                        // 记录传送日期
                        var dto = new TeleRecordDto()
                        {
                            SteamID = playerInfo.SteamID, LastTeleDateTime = DateTime.Now.ToString()
                        };
                        if (teleRecord == null)
                        {
                            _teleRecordService.Add(dto);
                        }
                        else
                        {
                            _teleRecordService.Update(dto);
                        }

                        Log.Info(string.Format("玩家: {0} SteamID: {1} 传送到了: {2}", playerInfo.PlayerName, playerInfo.SteamID, cityPosition.CityName));
                    }
                }
            }
            return(true);
        }