using NetSockets; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ShiftOS { public partial class BitnoteWallet : Form { /// /// GUI for the Bitnote Wallet package. /// public BitnoteWallet() { InitializeComponent(); Clients = new List(); foreach(var c in Package_Grabber.clients) { if(c.Value.IsConnected) { var client = new BitnoteClient(c.Key); client.GetBank(); Clients.Add(client); } } } public List Clients = null; public bool AddBitnotesToAddress(string addr, decimal amount) { bool res = false; foreach(var c in Clients) { if(c.Addresses != null) { foreach(var a in c.Addresses) { if(a.Address == addr) { if (res == false) { a.Bitnotes += amount; res = true; } } } c.UploadBank(c.Addresses); } } return res; } private void btnsync_Click(object sender, EventArgs e) { try { var t = new BackgroundWorker(); t.DoWork += (object s, DoWorkEventArgs a) => { foreach(var c in Clients) { SyncBitnotes(c.Addresses); c.UploadBank(c.Addresses); } }; t.RunWorkerAsync(); } catch { SyncBitnotes(new List()); API.CreateInfoboxSession("Error", "You cannot sync your Bitnotes as the connection to the server has failed.", infobox.InfoboxMode.Info); } } /// /// Syncs your private address with the provided list IF yours exists in there. If not, it'll add it. /// /// The list to sync. public void SyncBitnotes(List lst) { bool cont = false; int my_itm = 0; foreach (var itm in lst) { if(itm.Address == API.BitnoteAddress.Address) { cont = true; my_itm = lst.IndexOf(itm); } } if(cont == true) { if(lst[my_itm].Bitnotes < API.BitnoteAddress.Bitnotes) { lst[my_itm].Bitnotes = API.BitnoteAddress.Bitnotes; } else { API.BitnoteAddress.Bitnotes = lst[my_itm].Bitnotes; } } else { lst.Add(API.BitnoteAddress); } } public void UploadList(BitnoteClient client, List lst) { client.UploadBank(lst); } private void btnsend_Click(object sender, EventArgs e) { sendpanel.Show(); } public void Info(string message) => API.CreateInfoboxSession("Error", message, infobox.InfoboxMode.Info); private void btnconfirmsend_Click(object sender, EventArgs e) { if (txtrecipient.Text != "") { if (AddBitnotesToAddress(txtrecipient.Text, Convert.ToDecimal(Convert.ToDecimal(txtamount.Text).ToString("#.#####")))) { Info("The Bitnotes have been sent successfully."); } else { Info("That address doesn't exist in the database."); } } else { Info("You must enter a recipient Bitnote address!"); } sendpanel.Hide(); } private void tmrrefresh_Tick(object sender, EventArgs e) { if(API.BitnoteAddress == null) { SaveSystem.Utilities.BitnoteAddress = new SaveSystem.PrivateBitnoteAddress(); SaveSystem.Utilities.BitnoteAddress.Bitnotes = 0; SaveSystem.Utilities.BitnoteAddress.Address = SaveSystem.Utilities.GenerateNewBitnoteAddress(); } txtmyaddress.Text = API.BitnoteAddress.Address; if(API.BitnoteAddress.Bitnotes == 0) { lbmybitnotes.Text = "0 BTN"; } else { lbmybitnotes.Text = API.BitnoteAddress.Bitnotes.ToString("#.#####") + " BTN"; } } private void BitnoteWallet_Load(object sender, EventArgs e) { fltopbar.BackColor = API.CurrentSkin.titlebarcolour; fltopbar.ForeColor = API.CurrentSkin.titletextcolour; } } public class BitnoteClient { /// /// Creates a new Bitnote Client. /// /// IP address of the server to look at. public BitnoteClient(string IP) { try { var c = Package_Grabber.clients[IP]; c.OnReceived += (object s, NetReceivedEventArgs a) => { var obj = (ObjectModel)a.Data.Object; switch (obj.Command) { case "fail": Addresses = new List(); break; case "bitnote_bank": try { Addresses = JsonConvert.DeserializeObject>(API.BitnoteEncryption.Decrypt((string)obj.OptionalObject)); if(Addresses == null) { Addresses = new List(); } } catch { Addresses = new List(); } break; } }; _IP = IP; } catch { throw new ArgumentException("IP address not found in client list."); } } private string _IP = ""; public List Addresses = null; public void GetBank() { try { Package_Grabber.SendMessage(_IP, "btn getbank"); } catch { } } public void UploadBank(List bank) { try { Package_Grabber.SendMessage(_IP, "btn setbank", API.BitnoteEncryption.Encrypt(JsonConvert.SerializeObject(bank))); } catch { } } } }