static async Task <int> RunInfo(InfoVerb verb) { foreach (var source in verb.Source) { if (YoutubeClient.ValidateChannelId(source)) { var channel = await youtube.GetChannelAsync(source); Console.WriteLine(channel.Title); var uploads = await youtube.GetChannelUploadsAsync(source, 1); for (var i = 0; i < Math.Min(3, uploads.Count); i++) { var upload = uploads[i]; Console.WriteLine($"- {upload.Title} (id: {upload.Id}, date: {upload.UploadDate.Date.ToShortDateString()}, duration: {upload.Duration})"); } } else if (YoutubeClient.ValidateVideoId(source)) { var video = await youtube.GetVideoAsync(source); Console.WriteLine(video.Title); } } return(0); }
private bool HandleClient(NetworkRequest r, RequestEventArgs e) { var verb = new InfoVerb(); verb.Node = serverNode; SendResponse(e, Encoding.UTF8.GetBytes(verb.CreateRequest().Data)); return(true); }
private bool HandleInfo(RequestEventArgs e) { e.Response.Status = HttpStatusCode.OK; var verb = new InfoVerb(); verb.Node = model.LocalNode; NetworkRequest result = verb.CreateRequest(); byte[] data = Encoding.UTF8.GetBytes(result.Data); var generator = new ResponseWriter(); e.Response.ContentLength.Value = data.Length; generator.SendHeaders(e.Context, e.Response); e.Context.Stream.Write(data, 0, data.Length); e.Context.Stream.Flush(); return(true); }
private bool HandleConnect(NetworkRequest r, RequestEventArgs e) { string address = string.Empty; try { var iv = new ConnectVerb(); iv.ProcessRequest(r); address = iv.Address; if (string.IsNullOrEmpty(iv.Secret)) { //Dont allow connections with no secret return(false); } //Dont allow connections to ourselves.. if (iv.Address == serverNode.Location) { return(false); } //Only allow one connect attempt at once lock (sync) { if (connectingIDs.Contains(address)) { return(false); } connectingIDs.Add(address); } //Connect to the remote client var verb = new InfoVerb(); var client = new Client(serverNode); if (!client.Execute(verb, address)) { return(false); } //Connected ok var c = new ClientStream(); c.OnDisconnect += c_OnDisconnect; Node n = verb.GetValidatedNode(); if (null == n) { return(false); } n.Location = iv.Address; n.Online = true; n.NodeType = iv.ClientType; n.OverlordID = serverNode.ID; n.Secret = iv.Secret; lock (sync) { //Notify other clients var update = new UpdateVerb(); //Was this person already connected? ClientStream search = connectedClientNodes.Where(xn => xn.Node.ID == n.ID).FirstOrDefault(); if (null != search) { connectedClientNodes.Remove(search); search.Kill(); } c.Start(n, serverNode); connectedClientNodes.Add(c); update.Nodes.Add(n); NetworkRequest req = update.CreateRequest(); req.SourceID = serverNode.ID; req.OverlordID = serverNode.ID; req.AuthKey = iv.Secret; SendToStandardClients(req); //Dont send overlord logs to other overlords if (n.NodeType != ClientType.Overlord) { SendToOverlordClients(req); } } //Find client servers ThreadPool.QueueUserWorkItem(ScanClientAsync, n); //return ok //Add headers var headers = e.Response.Headers as HeaderCollection; if (null != headers) { headers.Add("FAP-AUTH", iv.Secret); headers.Add("FAP-SOURCE", serverNode.ID); headers.Add("FAP-OVERLORD", serverNode.ID); } SendResponse(e, null); //Send network info if (n.NodeType == ClientType.Overlord) { var update = new UpdateVerb(); //Only send local nodes foreach ( ClientStream peer in connectedClientNodes.ToList().Where(x => x.Node.NodeType == ClientType.Client)) { update.Nodes.Add(peer.Node); } NetworkRequest req = update.CreateRequest(); req.SourceID = serverNode.ID; req.OverlordID = serverNode.ID; req.AuthKey = iv.Secret; c.AddMessage(req); } else { var update = new UpdateVerb(); //None overlord client. Send local nodes and external ones. update.Nodes = GetBestKnownClientList(); NetworkRequest req = update.CreateRequest(); req.SourceID = serverNode.ID; req.OverlordID = serverNode.ID; req.AuthKey = iv.Secret; c.AddMessage(req); } return(true); } catch { } finally { connectingIDs.Remove(address); } SendError(e); return(false); }