예제 #1
0
        public MercuryResponse Subscribe([NotNull] string uri, [NotNull] ISubListener listener)
        {
            var response = SendSync(RawMercuryRequest.Sub(uri));

            if (response.StatusCode != 200)
            {
                throw new PubSubException(response.StatusCode);
            }

            if (response.Payload.Any())
            {
                foreach (var payload in response.Payload)
                {
                    var sub = Subscription.Parser.ParseFrom(payload);
                    lock (_subscriptions)
                    {
                        _subscriptions.Add(new InternalSubListener(sub.Uri, listener, true));
                    }
                }
            }
            else
            {
                lock (_subscriptions)
                {
                    _subscriptions.Add(new InternalSubListener(uri, listener, true));
                }
            }

            Debug.WriteLine($"Subscribed successfully to {uri}!");
            return(response);
        }
예제 #2
0
        public int Send([NotNull] RawMercuryRequest request,
                        [NotNull] ICallback callback)
        {
            var partial        = new List <byte[]>();
            var watch          = System.Diagnostics.Stopwatch.StartNew();
            var payloadNew     = new List <byte[]>();
            var requestPayload = request._payload.ToArray();
            var requestHeader  = request._header;

            if (requestPayload == null || requestHeader == null)
            {
                throw new Exception("An unknown error occured. the librar could be outdated");
            }

            var bytesOut = new MemoryStream();
            var s4B      = (BitConverter.GetBytes((short)4)).Reverse().ToArray();

            bytesOut.Write(s4B, 0, s4B.Length); // Seq length


            var seqB = BitConverter.GetBytes(Interlocked.Increment(ref _seqHolder)).Reverse().ToArray();

            bytesOut.Write(seqB, 0, seqB.Length); // Seq

            bytesOut.WriteByte(1);                // Flags
            var reqpB = BitConverter.GetBytes((short)(1 + requestPayload.Length)).Reverse().ToArray();

            bytesOut.Write(reqpB, 0, reqpB.Length); // Parts count

            var headerBytes2 = requestHeader.ToByteArray();
            var hedBls       = BitConverter.GetBytes((short)headerBytes2.Length).Reverse().ToArray();

            bytesOut.Write(hedBls, 0, hedBls.Length);             // Header length
            bytesOut.Write(headerBytes2, 0, headerBytes2.Length); // Header

            foreach (byte[] part in requestPayload)
            {
                // Parts
                var l = BitConverter.GetBytes((short)part.Length).Reverse().ToArray();
                bytesOut.Write(l, 0, l.Length);
                bytesOut.Write(part, 0, part.Length);
            }

            var cmd = request._header.Method.ToLower() switch
            {
                "sub" => MercuryPacket.Type.MercurySub,
                "unsub" => MercuryPacket.Type.MercuryUnsub,
                _ => MercuryPacket.Type.MercuryReq
            };

            _session.Send(cmd, bytesOut.ToArray());
            _callbacks.TryAdd((long)_seqHolder, callback);
            return(_seqHolder);
        }
예제 #3
0
        public MercuryResponse SendSync([NotNull] RawMercuryRequest request)
        {
            var callback = new SyncCallback();

            int seq  = Send(request, callback);
            var resp = callback.WaitResponse();

            if (resp == null)
            {
                throw new Exception(
                          $"Request timeout out, {MercuryRequestTimeout} passed, yet no response. seq: {seq}");
            }
            return(resp);
        }
예제 #4
0
        public void SendEvent([NotNull] EventBuilder builder)
        {
            try
            {
                var body = builder.ToArray();
                var req  = new RawMercuryRequest("hm://event-service/v1/events", "POST");
                req._payload.Add(body);
                req.AddUserField("Accept-Language", "en");
                req.AddUserField("X-ClientTimeStamp", TimeProvider.CurrentTimeMillis().ToString());

                MercuryResponse resp = _session.Mercury().SendSync(req);
                Debug.WriteLine(
                    $"Event sent. body: {EventBuilder.ToString(body)}, result: {resp.StatusCode.ToString()}");
            }
            catch (IOException ex)
            {
                Debug.WriteLine("Failed sending event: " + builder + ex.ToString());
            }
        }
예제 #5
0
        public void Unsubscribe([NotNull] string uri)
        {
            var response = SendSync(RawMercuryRequest.Unsub(uri));

            if (response.StatusCode != 200)
            {
                throw new PubSubException(response.StatusCode);
            }

            //_subscriptions.
            lock (_subscriptions)
            {
                var find = _subscriptions.FindIndex(k => k.Matches(uri));
                if (find != -1)
                {
                    _subscriptions.RemoveAt(find);
                }
            }

            Debug.WriteLine($"Unsubscribed successfully from {uri}!");
        }
예제 #6
0
 public Task AttachSocial()
 => Task.Run(() =>
 {
     var handler         = new SocialHandler(this);
     var usersSubscribed =
         Singleton <SpotifySession> .Instance.Mercury()
         .SendSync(new ProtobuffedMercuryRequest <Spotify.Social.UserListReply>(
                       RawMercuryRequest.Get(
                           $"hm://socialgraph/subscriptions/user/{Username}?count=200&last_result="),
                       Spotify.Social.UserListReply.Parser));
     foreach (var user in usersSubscribed.Users)
     {
         var response = Singleton <SpotifySession> .Instance.Mercury()
                        .SendSync(new JsonMercuryRequest <UserPresence>(
                                      RawMercuryRequest.Get($"hm://presence2/user/{user.Username}")));
         UserPresenceUpdated?.Invoke(this, response);
         Singleton <SpotifySession> .Instance.Mercury()
         .Subscribe($"hm://presence2/user/{user.Username}",
                    handler);
     }
 }, closedToken);
예제 #7
0
        FetchTracks([NotNull] String url)
        {
            var resp = _session.Mercury().SendSync(new JsonMercuryRequest <string>(RawMercuryRequest.Get(url)));

            return(ProtoUtils.JsonToContextTracks(JObject.Parse(resp)["tracks"] as JArray));
        }