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); }
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); }
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); }
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()); } }
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}!"); }
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);
FetchTracks([NotNull] String url) { var resp = _session.Mercury().SendSync(new JsonMercuryRequest <string>(RawMercuryRequest.Get(url))); return(ProtoUtils.JsonToContextTracks(JObject.Parse(resp)["tracks"] as JArray)); }