diff options
| author | MichaelTheShifter <[email protected]> | 2016-06-25 08:10:03 -0400 |
|---|---|---|
| committer | MichaelTheShifter <[email protected]> | 2016-06-25 08:10:03 -0400 |
| commit | 84f689b91a73e512b035df40bbcf556b008a3b81 (patch) | |
| tree | da1020b2b5866c7ce300ac7b9c97112fe80fa1b3 /source/WindowsFormsApplication1/Apps/HoloChat.cs | |
| parent | 6707e2076a63dafab686fd533c95fb8ceb6c23fa (diff) | |
| download | shiftos-c-_theultimatehacker-84f689b91a73e512b035df40bbcf556b008a3b81.tar.gz shiftos-c-_theultimatehacker-84f689b91a73e512b035df40bbcf556b008a3b81.tar.bz2 shiftos-c-_theultimatehacker-84f689b91a73e512b035df40bbcf556b008a3b81.zip | |
Sort source code into folders.
It feels better to know what's responsible for what... Plus I removed
some un-needed C# stuff.
Diffstat (limited to 'source/WindowsFormsApplication1/Apps/HoloChat.cs')
| -rw-r--r-- | source/WindowsFormsApplication1/Apps/HoloChat.cs | 666 |
1 files changed, 666 insertions, 0 deletions
diff --git a/source/WindowsFormsApplication1/Apps/HoloChat.cs b/source/WindowsFormsApplication1/Apps/HoloChat.cs new file mode 100644 index 0000000..1795d7b --- /dev/null +++ b/source/WindowsFormsApplication1/Apps/HoloChat.cs @@ -0,0 +1,666 @@ +using NetSockets; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ShiftOS +{ + public partial class HoloChat : Form + { + /// <summary> + /// Front-end for the HoloChat chat system. + /// </summary> + public HoloChat() + { + InitializeComponent(); + } + + public ChatClient Client = null; + public Dictionary<string, string> IPs = null; + + private void HoloChat_Load(object sender, EventArgs e) + { + SetupUI(); + tmrui.Start(); + } + + /// <summary> + /// Sets up the HoloCHat UI. + /// </summary> + public void SetupUI() + { + if (!API.LimitedMode) + { + IPs = new Dictionary<string, string>(); + lbrooms.Items.Clear(); + this.Invoke(new Action(() => + { + if (API.Upgrades["networkbrowser"] == false) + { + lbrooms.Items.Add(Hacker_Alliance.Name); + } + })); + + foreach (var client in Package_Grabber.clients) + { + if (client.Value.IsConnected) + { + client.Value.OnReceived += (object s, NetReceivedEventArgs<NetObject> a) => + { + try + { + if (!IPs.ContainsKey(client.Key)) + { + var obj = (ObjectModel)a.Data.Object; + if (obj.Command == "name") + { + string name = (string)obj.OptionalObject; + IPs.Add(client.Key, name); + } + } + else + { + var obj = (ObjectModel)a.Data.Object; + if (obj.Command == "name") + { + string name = (string)obj.OptionalObject; + IPs[client.Key] = name; + } + } + this.Invoke(new Action(() => + { + string r = ""; + foreach (string room in lbrooms.Items) + { + if (room == IPs[client.Key]) + { + r = room; + } + } + if (r == "") + { + lbrooms.Items.Add(IPs[client.Key]); + } + })); + } + catch + { + + } + }; + Package_Grabber.SendMessage(client.Key, "chat get_name"); + } + } + + } + else + { + if (FinalMission.EndGameHandler.FakeHoloChatRoom != null) + { + lbrooms.Items.Clear(); + lbrooms.Items.Add(FinalMission.EndGameHandler.FakeHoloChatRoom.Name); + } + } + } + + private FakeChatClient Hacker_Alliance + { + get + { + var r = new FakeChatClient(); + r.Name = "The Hacker Alliance"; + r.OtherCharacters = new List<string>(); + if (!API.Upgrades["networkbrowser"]) + { + r.OtherCharacters.Add("Richard Ladouceur"); //Dear djdeedahx0 and other non-ShiftOS members: DEAL with the last name - I'm not creative. - Michael + r.OtherCharacters.Add("Hacker101"); + r.Messages = JsonConvert.DeserializeObject<Dictionary<string, string>>(Properties.Resources.MidGame_Holochat); + r.Topic = "The Hacker Alliance - Please welcome our newest user!"; + } + return r; + + } + } + + private void btnconnect_Click(object sender, EventArgs e) + { + if(lbrooms.SelectedItem != null) + { + if (!API.LimitedMode) + { + string topic = (string)lbrooms.SelectedItem; + if (topic == Hacker_Alliance.Name) + { + SetupFakeClient(Hacker_Alliance); + } + else + { + string ip = ""; + foreach (var obj in IPs) + { + if (obj.Value == topic) + { + ip = obj.Key; + } + } + if (ip != "") + { + API.CreateInfoboxSession("Choose a Nickname", "Please enter a nick name.", infobox.InfoboxMode.TextEntry); + API.InfoboxSession.FormClosing += (object s, FormClosingEventArgs a) => + { + var res = API.GetInfoboxResult(); + if (res != "fail") + { + SetupClient(ip, res); + } + }; + } + } + } + else + { + if((string)lbrooms.SelectedItem == FinalMission.EndGameHandler.FakeHoloChatRoom.Name) + { + SetupFakeClient(FinalMission.EndGameHandler.FakeHoloChatRoom); + } + } + } + } + + /// <summary> + /// Set up a new client. + /// </summary> + /// <param name="address">IP address.</param> + /// <param name="nick">User nickname.</param> + public void SetupClient(string address, string nick) + { + var c = new ChatClient(address, nick); + c.OnMessageReceive += (object s, EventArgs a) => + { + var obj = (ChatMessage)s; + this.Invoke(new Action(() => + { + txtchat.AppendText(Environment.NewLine + $"<{obj.User.Name}> {obj.Text}"); + })); + c.GetUsers(); + }; + c.OnUserListReceived += (object s, EventArgs a) => + { + var obj = (List<ChatUser>)s; + this.Invoke(new Action(() => + { + lbusers.Items.Clear(); + foreach (var user in obj) + { + lbusers.Items.Add(user.Name); + } + })); + }; + c.OnUserJoin += (object s, EventArgs a) => + { + var obj = (ChatUser)s; + this.Invoke(new Action(() => + { + + txtchat.AppendText(Environment.NewLine + $"{obj.Name} has joined this room."); + })); + c.GetUsers(); + }; + c.OnTopicReceived += (object s, EventArgs a) => + { + string topic = (string)s; + this.Invoke(new Action(() => + { + lbtopic.Text = topic; + })); + }; + c.OnUserLeave += (object s, EventArgs a) => + { + var obj = (ChatUser)s; + this.Invoke(new Action(() => + { + txtchat.AppendText(Environment.NewLine + $"{obj.Name} has left this room."); + })); + c.GetUsers(); + }; + c.GetUsers(); + c.GetTopic(); + Client = c; + + } + + public void SetupFakeClient(FakeChatClient fClient) + { + lbtopic.Text = fClient.Topic; + var t = new System.Windows.Forms.Timer(); + t.Interval = 500; + t.Tick += (object s, EventArgs a) => + { + //userlist + lbusers.Items.Clear(); + foreach (var user in fClient.OtherCharacters) + { + lbusers.Items.Add(user); + } + }; + t.Start(); + + int m = 0; + //message buffer + var mb = new System.Windows.Forms.Timer(); + mb.Tick += (object s, EventArgs a) => + { + string message = fClient.Messages.Keys.ElementAt(m); + string user = fClient.Messages[message]; + //show message on textbox + if (message.StartsWith("install:")) + { + try + { + string upg = message.Remove(0, 8); + API.Upgrades[upg] = true; + API.CurrentSession.SetupDesktop(); + } + catch + { + + } + } + else + { + txtchat.AppendText(Environment.NewLine + $"<{user}> {message}"); + } + if (m < fClient.Messages.Count - 1) + { + m += 1; + } + else + { + mb.Stop(); + //Completed the objective! + FinalMission.EndGameHandler.GoToNextObjective(); + } + }; + mb.Interval = 4000; + mb.Start(); + tmrui.Stop(); + pnlintro.Hide(); + } + + private void txtsend_KeyDown(object sender, KeyEventArgs e) + { + if(e.KeyCode == Keys.Enter) + { + e.SuppressKeyPress = true; + if (txtsend.Text != "") + { + if (txtsend.Text.ToLower() == "/disconnect") + { + Client.Leave(); + Client = null; + txtsend.Text = ""; + } + else { + Client.Send(txtsend.Text); + txtsend.Text = ""; + } + } + } + } + + private void me_Closing(object sender, FormClosingEventArgs e) + { + if(Client != null) + { + Client.Leave(); + } + } + + private void tmrui_Tick(object sender, EventArgs e) + { + if(Client == null) + { + pnlintro.Show(); + txtsend.Enabled = false; + } + else + { + pnlintro.Hide(); + txtsend.Enabled = true; + } + } + + private void btnrefresh_Click(object sender, EventArgs e) + { + SetupUI(); + } + + private void txtchat_TextChanged(object sender, EventArgs e) + { + txtchat.Select(txtchat.TextLength, 0); + txtchat.ScrollToCaret(); + txtsend.Focus(); + } + } + + public class ChatClient + { + #region Constructors + + /// <summary> + /// Creates a new chat client. + /// </summary> + /// <param name="IP">IP address</param> + /// <param name="nick">User nickname</param> + public ChatClient(string IP, string nick) + { + NetObjectClient c = null; + foreach(var client in Package_Grabber.clients) + { + if(client.Key == IP) + { + if(client.Value.IsConnected == true) + { + c = client.Value; + IP_Address = IP; + } + } + } + if(c != null) + { + c.OnReceived += (object s, NetReceivedEventArgs<NetObject> a) => + { + try { + var obj = (ObjectModel)a.Data.Object; + string[] args = obj.Command.Split(' '); + if (args[0] == "chat") + { + switch (args[1]) + { + case "userbanned": + try + { + var usr = (ChatUser)obj.OptionalObject; + if(usr.Name == nick) + { + API.CurrentSession.Invoke(new Action(() => + { + API.CreateInfoboxSession("You're banned.", "You have been banned from this chat.", infobox.InfoboxMode.Info); + Leave(); + })); + } + } + catch + { + + } + break; + case "auth_req": + try + { + var usr = (ChatUser)obj.OptionalObject; + if (usr.Name == nick) + { + Thread.Sleep(1000); + API.CurrentSession.Invoke(new Action(() => + { + API.CreateInfoboxSession("Enter Password", "Please enter your password.", infobox.InfoboxMode.TextEntry); + API.InfoboxSession.FormClosing += (object sen, FormClosingEventArgs arg) => + { + var result = API.GetInfoboxResult(); + AuthenticateWithServer(usr.Name, result); + }; + })); + } + } + catch + { + + } + break; + case "auth_fail": + try + { + var usr = (ChatUser)obj.OptionalObject; + if (usr.Name == nick) + { + API.CurrentSession.Invoke(new Action(() => + { + API.CreateInfoboxSession("Error", "You have entered an incorrect password.", infobox.InfoboxMode.Info); + })); + } + } + catch + { + + } + + break; + case "joined": + try + { + var usr = (ChatUser)obj.OptionalObject; + if (usr.Name == nick) + { + if (_User == null) + { + _User = usr; + } + } + if (_User != usr) + { + var h = OnUserJoin; + if (h != null) + { + h(usr, new EventArgs()); + } + } + } + catch + { + + } + break; + case "userlist": + try + { + var lst = (List<ChatUser>)obj.OptionalObject; + var h = OnUserListReceived; + if (h != null) + { + h(lst, new EventArgs()); + } + } + catch + { + + } + break; + case "left": + try + { + var usr = (ChatUser)obj.OptionalObject; + var h = OnUserLeave; + if (h != null) + { + h(usr, new EventArgs()); + } + } + catch + { + + } + break; + case "message_received": + try + { + var usr = (ChatMessage)obj.OptionalObject; + var h = OnMessageReceive; + if (h != null) + { + h(usr, new EventArgs()); + } + } + catch + { + + } + break; + } + } + else if (args[0] == "topic") + { + try + { + string name = (string)obj.OptionalObject; + var h = OnTopicReceived; + if(h != null) + { + h(name, new EventArgs()); + } + } + catch + { + + } + } + } + catch + { + + } + }; + Join(nick); + } + else + { + throw new ArgumentException("IP Address not found."); + } + } + #endregion + + #region Events + + public event EventHandler OnUserJoin; + public event EventHandler OnUserLeave; + public event EventHandler OnMessageReceive; + public event EventHandler OnUserListReceived; + public event EventHandler OnTopicReceived; + + + #endregion + + #region Variables + + private string IP_Address = null; + public ChatUser User { get { return _User; } } + private ChatUser _User = null; + #endregion + + #region Methods + + /// <summary> + /// Authenticates with the server. + /// </summary> + /// <param name="password">Password to authenticate using.</param> + public void AuthenticateWithServer(string nick, string password) + { + var usr = new ChatUser(); + usr.Name = nick; + var msg = new ChatMessage(); + msg.Text = password; + msg.User = usr; + Package_Grabber.SendMessage(IP_Address, "chat authenticate", msg); + } + + /// <summary> + /// Joins the server. + /// </summary> + /// <param name="nick">Nickname.</param> + public void Join(string nick) + { + var usr = new ChatUser(); + usr.Name = nick; + var msg = new ChatMessage(); + msg.User = usr; + Package_Grabber.SendMessage(IP_Address, "chat join", msg); + } + + /// <summary> + /// Leaves the server. + /// </summary> + public void Leave() + { + if (_User != null) + { + var msg = new ChatMessage(); + msg.User = _User; + Package_Grabber.SendMessage(IP_Address, "chat leave", msg); + } + } + + /// <summary> + /// Requests a list of online users. + /// </summary> + public void GetUsers() + { + try + { + Package_Grabber.SendMessage(IP_Address, "chat get_users"); + } + catch + { + + } + } + + /// <summary> + /// Requests the topic string of the server. + /// </summary> + public void GetTopic() + { + try + { + Package_Grabber.SendMessage(IP_Address, "chat get_topic"); + } + catch + { + + } + } + + /// <summary> + /// Sends a message to the server. + /// </summary> + /// <param name="Text">Message text.</param> + public void Send(string Text) + { + if (_User != null) + { + var msg = new ChatMessage(); + msg.User = _User; + msg.Text = Text; + Package_Grabber.SendMessage(IP_Address, "chat normal", msg); + + } + } + + #endregion + } + + public class FakeChatClient + { + public string Name { get; set; } + public string Topic { get; set; } + public List<string> OtherCharacters { get; set; } + public Dictionary<string, string> Messages { get; set; } + } +} |
