static async Task SendPics() { Console.WriteLine("Loading config.."); using (var sr = new StreamReader("config.json")) { Config = JsonConvert.DeserializeObject <Config>(await sr.ReadToEndAsync()); } Console.WriteLine($"Loading pools.."); Pools = await GetPools(); Console.WriteLine($"Starting ZMQ thread..."); var zqt = new Thread(new ThreadStart(ReadBlocks)); zqt.Start(); var igen = new ProcessStartInfo("ffmpeg"); while (IsRunning) { var block = await BlockStream.ReceiveAsync(); var block_hash = block.Header.GetHash().ToString(); var block_data = block.ToBytes(); var pixels = block_data.Length / 3; var sres = (int)Math.Ceiling(Math.Sqrt(pixels)); var padding = (sres * sres * 3) - block_data.Length; Console.WriteLine($"Adding {padding} bytes padding.."); File.WriteAllBytes("block.dat", block_data.Concat(new byte[padding]).ToArray()); igen.Arguments = $"-y -f rawvideo -pix_fmt rgb24 -s {sres}x{sres} -i block.dat -vframes 1 {block_hash}.png"; var fp = Process.Start(igen); //await fp.StandardInput.BaseStream.WriteAsync(block_data.Concat(new byte[padding])); fp.WaitForExit(); var btc = block.Transactions.Sum(a => a.Outputs.Sum(b => b.Value.Satoshi * 1e-8)); var segwit = block.Transactions.Count(a => a.HasWitness); var btcusd = await GetBTCPrice(); var pool = GetPoolInfo(block); var status = $"Bitcoin tip updated{(pool != null ? $" by {pool.name}" : string.Empty)}! {block_hash} ({(block_data.Length / 1000d).ToString("#,##0.00")} kB with {block.Transactions.Count.ToString("#,###")} txns, moving ₿{btc.ToString("#,##0")}, worth ${(btc * btcusd.USD).ToString("#,##0")})"; var media = await UploadImage($"{block_hash}.png"); if (media != null) { var post = await PostStatus(status, new List <string> { media.id }); Console.WriteLine($"Block posted! {post.url}"); } } }