Пример #1
0
        public static CKey Alloc()
        {
            global::System.IntPtr cPtr = C4dApiPINVOKE.CKey_Alloc();
            CKey ret = (cPtr == global::System.IntPtr.Zero) ? null : new CKey(cPtr, false);

            return(ret);
        }
Пример #2
0
        public CKey GetClone(AliasTrans trans)
        {
            global::System.IntPtr cPtr = C4dApiPINVOKE.CKey_GetClone(swigCPtr, AliasTrans.getCPtr(trans));
            CKey ret = (cPtr == global::System.IntPtr.Zero) ? null : new CKey(cPtr, false);

            return(ret);
        }
        public async Task <string> GetByondKeyAsync(CKey ckey)
        {
            const string query = @"SELECT ck.byond_key FROM ckey ck WHERE ck.ckey = @ckey";

            await using var conn = GetConnection();
            return((await conn.QueryAsync <string>(query, new { ckey = ckey.Cleaned })).FirstOrDefault());
        }
        public async Task <List <ServerStatistic> > GetServerCountForCKeyAsync(CKey ckey)
        {
            const string query = @"
                WITH rounds AS (
                    SELECT DISTINCT
                        c.round,
                        c.ckey
                    FROM
                        connection c
                    WHERE
                        c.ckey = @ckey
                )
                SELECT
                    s.display AS server,
                    COUNT(*) FILTER (WHERE rp.id IS NOT NULL) AS played,
                    COUNT(*) FILTER (WHERE rp.id IS NULL) AS connected,
                    COALESCE(EXTRACT(EPOCH FROM SUM((SELECT SUM(c.disconnect_time - c.connect_time) FROM connection c WHERE c.round = r_init.round AND c.ckey = r_init.ckey)) FILTER (WHERE rp.id IS NOT NULL)) * 1000, 0) AS playedmillisec,
                    COALESCE(EXTRACT(EPOCH FROM SUM((SELECT SUM(c.disconnect_time - c.connect_time) FROM connection c WHERE c.round = r_init.round AND c.ckey = r_init.ckey)) FILTER (WHERE rp.id IS NULL)) * 1000, 0) AS connectedmillisec 
                FROM
                    rounds r_init
                    INNER JOIN round r ON r.id = r_init.round
                    LEFT JOIN server s ON s.id = r.server
                    LEFT JOIN round_player rp ON rp.round = r_init.round AND rp.ckey = r_init.ckey
                GROUP BY
                    s.display";

            await using var conn = GetConnection();
            return((await conn.QueryAsync <ServerStatistic>(query, new { ckey = ckey.Cleaned })).ToList());
        }
Пример #5
0
        public async Task <IResult> LookupCkey(string key)
        {
            var ckey = new CKey(key);
            var bans = (await _dbContext.Bans
                        .Include(x => x.JobBans)
                        .Include(x => x.SourceNavigation)
                        .Where(x => x.CKey == ckey.CanonicalKey)
                        .ToListAsync())
                       .Select(BanData.FromBan);

            // Collect statistics
            var fields = new List <IEmbedField>()
            {
                new EmbedField("Server bans", bans.Count(x => x.Type == BanType.Server).ToString(), true),
                new EmbedField("Job bans", bans.Count(x => x.Type == BanType.Job).ToString(), true),
                new EmbedField("Active bans", bans.Count(x => x.Active).ToString(), true)
            };

            // Generate embed to relay the information
            var embed = new Embed("Search Results",
                                  Colour: _feedback.Theme.Success,
                                  Description:
                                  $"Found the following details when searching for ``{key}``. You may be interested in viewing the " +
                                  $"full details of the bans on [CentCom](https://centcom.melonmesa.com/viewer/view/{key}), or viewing " +
                                  $"their /tg/ activity on [Scrubby](https://scrubby.melonmesa.com/ckey/{key}).",
                                  Fields: fields,
                                  Timestamp: DateTimeOffset.UtcNow,
                                  Footer: new EmbedFooter(VersionUtility.Version));

            return(await _feedback.SendContextualEmbedAsync(embed));
        }
Пример #6
0
            void _RecvS(CKey Key_, CStream Stream_)
            {
                SScHeader Header = new SScHeader();

                Header.Push(Stream_);
                _RecvFunc(Key_, Header.Proto, Stream_);
            }
Пример #7
0
        public void LogError(EErrorCode inErrorCode, CKey inKey)
        {
            _error_count++;
            string text = string.Format("{0} [{1}].", inErrorCode, inKey.GetPath());

            _printer.LogError(text);
        }
Пример #8
0
            public void SendAllExcept(CKey Key_, CStream Stream_)
            {
                foreach (var i in _PeersExt)
                {
                    if (i.DoesWillClose())
                    {
                        continue;
                    }

                    if (i.Key.Equals(Key_))
                    {
                        continue;
                    }

                    try
                    {
                        i.Send(Stream_);
                    }
                    catch
                    {
                        i.WillClose(TimeSpan.Zero);
                        continue;
                    }

                    if (!i.itPeerWillExpire)
                    {
                        _Net.Send(i.NetKey, new SHeaderCs(EProtoCs.UserProto), Stream_);
                    }
                }
            }
Пример #9
0
            void _LinkM(CKey Key_, CNamePort NamePort_)
            {
                var Client = _Clients[(Int32)Key_.PeerNum];

                Client.MasterNamePort.Data = new CNamePort(NamePort_);
                _NetM.Send(Key_.PeerNum, new SHeader(EProto.CmLogin), new SCmLogin(Client.UID, Client.ID, Client.SubUID));
            }
Пример #10
0
            void _LinkCallback(CKey Key_, CNamePort NamePort_)
            {
                var itPeerNet = _PeersNet.Get((Int32)Key_.PeerNum); // _Net.Connect() 호출정상이면 무조건 _PeersNet 에 추가된 상태이므로 itPeerNet 체크 불필요

                if (!itPeerNet.Data.ExtKey)
                {
                    return;
                }

                var itPeerExt = _PeersExt.Get((Int32)itPeerNet.Data.ExtKey.PeerNum);

                if (!itPeerExt)
                {
                    return;
                }

                if (itPeerExt.Data.HaveBeenLinked)
                {
                    _Net.Send(Key_.PeerNum, new SHeaderCs(EProtoCs.ReLink), new SReLinkCs(itPeerExt.Data.ServerExtKey, itPeerExt.Data.ProtoSeqMustRecv));
                }
                else
                {
                    _Net.Send(Key_.PeerNum, new SHeaderCs(EProtoCs.Link), new SLinkCs());
                }
            }
Пример #11
0
        public async Task <IActionResult> GetSuicidesForCKey(string ckey)
        {
            var toSearch = new CKey(ckey);
            var result   = await _suicides.GetSuicidesForCKey(toSearch);

            return(Ok(result));
        }
Пример #12
0
            void _RecvReLink(CKey NetKey_, _TPeersNetIt itPeerNet_, _TPeersExtIt itPeerExt_, CStream Stream_)
            {
                var Proto = new SReLinkSc();

                Stream_.Pop(Proto);

                _PeersWillExpire.Remove(itPeerExt_.Data.itPeerWillExpire);
                itPeerExt_.Data.itPeerWillExpire = _PeersWillExpire.End();

                TProtoSeq MustDeleteCnt = (Proto.ServerProtoSeqMustRecv - itPeerExt_.Data.ProtoSeqFirstForSendProtos); // 0 이상의 값이 나와야 함.(조작에의해 음수(큰 양수)가 나오더라도 상관없음

                for (var it = itPeerExt_.Data.SendProtos.Begin(); it;)
                {
                    if (MustDeleteCnt == 0)
                    {
                        break;
                    }

                    var itCheck = it;
                    it.MoveNext();

                    itCheck.Data.Clear();
                    itPeerExt_.Data.SendProtos.Remove(itCheck);
                    --MustDeleteCnt;
                }
                itPeerExt_.Data.ProtoSeqFirstForSendProtos = Proto.ServerProtoSeqMustRecv;

                foreach (var i in itPeerExt_.Data.SendProtos)
                {
                    _Net.Send(NetKey_, new SHeaderCs(EProtoCs.ReSend), i);
                }

                _LinkFuncSoft(itPeerExt_.Data.Key, itPeerExt_.Data.NamePort);
            }
Пример #13
0
        public CKey GetKey(int index)
        {
            global::System.IntPtr cPtr = C4dApiPINVOKE.CCurve_GetKey__SWIG_0(swigCPtr, index);
            CKey ret = (cPtr == global::System.IntPtr.Zero) ? null : new CKey(cPtr, false);

            return(ret);
        }
Пример #14
0
        /// <summary>
        /// Open a file from Encoding Key
        /// </summary>
        /// <param name="key">The Long Encoding Key</param>
        /// <returns>Loaded file</returns>
        public Stream OpenEKey(CKey key)    // ekey = value of ckey in encoding table
        {
            Stream stream = default;

            if (CreateArgs.Mode == ClientCreateArgs.InstallMode.CASC)
            {
                stream = ContainerHandler?.OpenEKey(key.AsEKey());
            }

            if (stream != null || !CreateArgs.Online)
            {
                return(stream == null ? null : new BLTEStream(this, stream));
            }

            stream = NetHandle.OpenData(key);
            if (stream == null)
            {
                return(null);
            }
            var ms = new MemoryStream();

            stream.CopyTo(ms);
            ms.Position = 0;
            return(new BLTEStream(this, ms));
        }
Пример #15
0
        public CKey FindNextUnmuted(int idx, SWIGTYPE_p_Int32 ret_idx)
        {
            global::System.IntPtr cPtr = C4dApiPINVOKE.CCurve_FindNextUnmuted__SWIG_0(swigCPtr, idx, SWIGTYPE_p_Int32.getCPtr(ret_idx));
            CKey ret = (cPtr == global::System.IntPtr.Zero) ? null : new CKey(cPtr, false);

            return(ret);
        }
Пример #16
0
        public CKey FindPrevUnmuted(int idx)
        {
            global::System.IntPtr cPtr = C4dApiPINVOKE.CCurve_FindPrevUnmuted__SWIG_1(swigCPtr, idx);
            CKey ret = (cPtr == global::System.IntPtr.Zero) ? null : new CKey(cPtr, false);

            return(ret);
        }
Пример #17
0
            public new bool Close(CKey Key_)
            {
                var Peer = _Peers.Get((Int32)Key_.PeerNum);

                if (Peer)
                {
                    if (Peer.Data.Key.PeerCounter != Key_.PeerCounter)
                    {
                        return(false);
                    }

                    _Close(Peer, ENetRet.UserClose);

                    return(true);
                }
                else
                {
                    var PeerConnecting = _PeersAndConnectings.Get((Int32)Key_.PeerNum);
                    if (!PeerConnecting)
                    {
                        return(false);
                    }

                    if (PeerConnecting.Data.PeerCounter != Key_.PeerCounter)
                    {
                        return(false);
                    }

                    _PeersAndConnectings.Remove(PeerConnecting); // 여기서 먼저 지워야 LockFree 큐에서 들어오는 Connect 정보가 처리되지 않음.
                    _Connectings.Remove((Int32)Key_.PeerNum);
                    _LinkFail(Key_.PeerNum, ENetRet.UserClose);

                    return(true);
                }
            }
Пример #18
0
            void _Recv(CKey Key_, CStream Stream_)
            {
                Int32 Proto = 0;

                Stream_.Pop(ref Proto);

                switch ((EProto)Proto)
                {
                case EProto.AcServerToConnect:
                {
                    _RecvAcServerToConnect(Key_, Stream_);
                    return;
                }

                case EProto.ScAllocated:
                {
                    _RecvScAllocated(Key_, Stream_);
                    return;
                }

                case EProto.ScUserProto:
                {
                    _RecvFunc(Key_, Stream_);
                    return;
                }

                default:
                {
                    _Net.Close(Key_.PeerNum);
                    return;
                }
                }
            }
Пример #19
0
        public async Task <IActionResult> GetReceiptsForCKey(string ckey)
        {
            var toSearch = new CKey(ckey);
            var result   = await _players.GetRoundReceiptsForPlayer(toSearch);

            return(Ok(result));
        }
Пример #20
0
            void _RecvA(CKey Key_, CStream Stream_)
            {
                var Header = new SHeader();

                Stream_.Pop(Header);

                if (_Clients[(Int32)Key_.PeerNum].IsCheck())
                {
                    switch (Header.Proto)
                    {
                    case EProto.AcCheck: _RecvAcCheck(Key_, Stream_); return;

                    case EProto.AcCheckFail: _RecvAcCheckFail(Key_, Stream_); return;

                    default: _CheckFailAndClose(Key_.PeerNum, EGameRet.InvalidPacket); return;
                    }
                }
                else
                {
                    switch (Header.Proto)
                    {
                    case EProto.AcLogin: _RecvAcLogin(Key_, Stream_); return;

                    case EProto.AcLoginFail: _RecvAcLoginFail(Key_, Stream_); return;

                    default: _LoginFailAndCloseA(Key_.PeerNum, EGameRet.InvalidPacket); return;
                    }
                }
            }
Пример #21
0
            public void Send(CKey Key_, Int64 Data_) // unity덕분으로 .net 버젼이 낮아 dynamic 으로 처리불가하여 이렇게 처리...
            {
                var itPeerExt = _PeersExt.Get((Int32)Key_.PeerNum);

                if (!itPeerExt)
                {
                    return;
                }

                if (!itPeerExt.Data.Key.Equals(Key_))
                {
                    return;
                }

                if (itPeerExt.Data.DoesWillClose())
                {
                    return;
                }

                try
                {
                    itPeerExt.Data.Send(Data_);
                }
                catch
                {
                    itPeerExt.Data.WillClose(TimeSpan.Zero);
                    return;
                }

                if (!itPeerExt.Data.itPeerWillExpire)
                {
                    _Net.Send(itPeerExt.Data.NetKey, new SHeaderCs(EProtoCs.UserProto), Data_);
                }
            }
Пример #22
0
            void _RecvUnLink(CKey NetKey_, CStream Stream_)
            {
                var Proto = new SUnLinkSc();

                Stream_.Pop(Proto);

                _Net.Close(NetKey_.PeerNum);
            }
Пример #23
0
            void _RecvScAllocated(CKey Key_, CStream Stream_)
            {
                var Proto = new SScAllocated();

                Stream_.Pop(Proto);

                _LinkFuncS(Key_, _Servers[(Int32)Key_.PeerNum].Login());
            }
Пример #24
0
 public _CAgentInfo(CKey Key_, ListViewItem Item_, SAgentOption AgentOption_, JsonDataObject AgentStat_, JsonDataObject ProcStat_)
 {
     Key         = Key_;
     Item        = Item_;
     AgentOption = AgentOption_;
     AgentStat   = AgentStat_;
     ProcStat    = ProcStat_;
 }
Пример #25
0
            void _RecvScLoginFail(CKey Key_, CStream Stream_)
            {
                var Proto = new SScLoginFail();

                Stream_.Pop(Proto);

                _LoginFailAndCloseS(Key_.PeerNum, Proto.GameRet);
            }
Пример #26
0
            void _RecvAcCheckFail(CKey Key_, CStream Stream_)
            {
                var Proto = new SAcCheckFail();

                Stream_.Pop(Proto);

                _CheckFailAndClose(Key_.PeerNum, Proto.GameRet);
            }
Пример #27
0
        public void CKeyShouldSerialize()
        {
            var   options      = GetOptions();
            ICKey ckey         = new CKey("Bobbahbrown");
            var   serialized   = JsonSerializer.Serialize(ckey, options);
            var   deserialized = JsonSerializer.Deserialize <ICKey>(serialized, options);

            Assert.Equal("bobbahbrown", deserialized?.CanonicalKey);
        }
Пример #28
0
            void _RecvScLogin(CKey Key_, CStream Stream_)
            {
                var Proto = new SScLogin();

                Stream_.Pop(Proto);

                _Clients[(Int32)Key_.PeerNum].Login(Proto.Nick);
                _LinkFunc(Key_, _Clients[(Int32)Key_.PeerNum].UID, _Clients[(Int32)Key_.PeerNum].Nick);
            }
Пример #29
0
            void _RecvScPatchData(CKey Key_, CStream Stream_)
            {
                var Proto = new SPatchData();

                Stream_.Pop(Proto);

                _Patch(Proto);
                _NetB.CloseAll();
            }
Пример #30
0
        void Recv(CKey Key_, CStream Stream_)
        {
            Int32 ProtoNum = 0;

            Stream_.Pop(ref ProtoNum);

            _Binder.Recv(Key_, ProtoNum, Stream_);
            _Log("RecvCallback");
        }
Пример #31
0
 public CopyContext(CKey key, IEnumerable<MethodInfo> getters, IEnumerable<MethodInfo> setters)
 {
     Key = key;
     Getters = getters.ToList();
     Setters = setters.ToList();
 }