private static void ServeGuessNumberRequest(HttpListenerContext ctx) { ctx.Response.ContentType = "text/html"; userInput = ctx.Request.QueryString ["input"]; var bytecode = Shovel.Api.GetBytecode(ProgramSources()); var vm = Shovel.Api.RunVm(bytecode, ProgramSources(), Udps(), shovelVmState); if (Shovel.Api.VmExecutionComplete(vm)) { shovelVmState = null; pageContent = new StringBuilder(); userInput = null; readState = ReadStates.None; vm = Shovel.Api.RunVm(bytecode, ProgramSources(), Udps(), shovelVmState); } shovelVmState = Shovel.Api.SerializeVmState(vm); using (var sw = new StreamWriter(ctx.Response.OutputStream)) { sw.Write("<!DOCTYPE html>\n"); sw.Write(pageContent.ToString()); sw.Write("<form action='/' method='get'>"); sw.Write("<input type='text' name='input' id='shovel-input'/>"); sw.Write("<input type='submit' value='Submit'/>"); sw.Write("</form>"); sw.Write("<script>\n"); sw.Write("document.getElementById('shovel-input').focus()\n"); sw.Write("</script>\n"); } ctx.Response.OutputStream.Close(); }
public static void OnLoggedOut() { loggedIn = false; loginSession = null; currentUserId = null; socketConnected = false; Users.Clear(); ReadStates.Clear(); Messages.Clear(); Channels.Clear(); Members.Clear(); Groups.Clear(); HasMoreMembers.Clear(); DiscoverChannels.Clear(); if (_instance != null) { using (_instance.window.getScope()) { HomePage.currentState.Clear(); } } _client.Close(); UpdateWindowCanvas(); }
private void MCommPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (e.EventType == SerialData.Chars) { while (mCommPort.BytesToRead > 0) { byte b = (byte)mCommPort.ReadByte(); Console.Write(b); switch (mReadState) { case ReadStates.READ: { mByteBuffer.Clear(); switch (b) { case PacketHeaders.ADD_CTRL: mReadState = ReadStates.ADD_CTRL; mBytesToRead = PacketHeaders.SizeOfAddCtrlStruct; break; case PacketHeaders.UPDATE_CTRL: mReadState = ReadStates.UPDATE_CTRL; mBytesToRead = PacketHeaders.SizeOfBaseCtrlDataStruct; bGotUpdateSize = false; break; } } break; case ReadStates.ADD_CTRL: { mByteBuffer.Add(b); if (--mBytesToRead == 0) { Console.WriteLine("GOT AN ADD CTRL"); mReadState = ReadStates.READ; AddCtrlEvent?.Invoke(new PacketHeaders.AddCtrl(mByteBuffer)); } } break; case ReadStates.UPDATE_CTRL: { mByteBuffer.Add(b); if (--mBytesToRead == 0) { if (!bGotUpdateSize) { int size = (Int16)(((Int16)mByteBuffer[3] << 8) | mByteBuffer[2]); mBytesToRead = size; bGotUpdateSize = true; } else { Console.WriteLine("GOT AN UPDATE CTRL"); mReadState = ReadStates.READ; UpdateCtrlEvent?.Invoke(new PacketHeaders.CtrlData(mByteBuffer)); } } } break; } } } }
static IEnumerable <Shovel.Callable> Udps() { var rng = new Random(); Action <Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> print = (api, args, result) => { if (args.Length > 0 && args [0].Kind == Shovel.Value.Kinds.String) { pageContent.Append("<span>"); pageContent.Append(HttpUtility.HtmlEncode(args [0].String)); pageContent.Append("</span>"); } }; Action <Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> printLn = (api, args, result) => { if (args.Length > 0 && args [0].Kind == Shovel.Value.Kinds.String) { pageContent.Append("<span>"); pageContent.Append(HttpUtility.HtmlEncode(args [0].String)); pageContent.Append("</span><br/>"); } }; Action <Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> readInt = (api, args, result) => { if (readState == ReadStates.None) { result.After = Shovel.UdpResult.AfterCall.NapAndRetryOnWakeUp; readState = ReadStates.ReadInteger; } else if (readState == ReadStates.ReadInteger) { int dummy; if (!int.TryParse(userInput, out dummy)) { dummy = 0; } result.Result = Shovel.Value.MakeInt(dummy); readState = ReadStates.None; pageContent.Append(HttpUtility.HtmlEncode(userInput)); pageContent.Append("<br/>"); } else { throw new InvalidOperationException(); } }; Action <Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> readChar = (api, args, result) => { if (readState == ReadStates.None) { result.After = Shovel.UdpResult.AfterCall.NapAndRetryOnWakeUp; readState = ReadStates.ReadChar; } else if (readState == ReadStates.ReadChar) { var line = userInput; if (line.Length > 0) { result.Result = Shovel.Value.Make(line.Substring(0, 1)); } else { result.Result = Shovel.Value.Make(""); } readState = ReadStates.None; pageContent.Append(HttpUtility.HtmlEncode(userInput)); pageContent.Append("<br/>"); } else { throw new InvalidOperationException(); } }; Action <Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> random = (api, args, result) => { result.Result = Shovel.Value.MakeFloat(rng.NextDouble()); }; return(new Shovel.Callable[] { Shovel.Callable.MakeUdp("print", print, 1), Shovel.Callable.MakeUdp("printLn", printLn, 1), Shovel.Callable.MakeUdp("readInt", readInt, 0), Shovel.Callable.MakeUdp("readChar", readChar, 0), Shovel.Callable.MakeUdp("random", random, 0), }); }
private static void ProcessMessageCreateFrame(MessageCreateFrame messageCreateFrame) { var frameMessage = messageCreateFrame.data; if (frameMessage.type == "normal") { Users[frameMessage.author.id] = frameMessage.author; } if (Messages.ContainsKey(frameMessage.channelId)) { var idx = -1; for (var i = 0; i < Messages[frameMessage.channelId].Count; ++i) { if (Messages[frameMessage.channelId][i].nonce == frameMessage.nonce) { idx = i; break; } } if (idx > -1) { Messages[frameMessage.channelId][idx] = frameMessage; } else { var addLately = false; if (_instance != null) { using (_instance.window.getScope()) { addLately = HomePage.currentState.SelectedChannelId == frameMessage.channelId && ChattingWindow.currentState.m_ScrollController.offset > 50f; } } if (addLately) { NewMessages.Add(frameMessage); } else { Messages[frameMessage.channelId].Insert(0, frameMessage); } } } string selectedChannelId = null; if (_instance != null) { using (_instance.window.getScope()) { if (HomePage.currentState != null) { selectedChannelId = HomePage.currentState.SelectedChannelId; } } } if (selectedChannelId != null) { if (frameMessage.channelId == selectedChannelId && ReadStates.ContainsKey(selectedChannelId)) { ReadStates[selectedChannelId].lastMessageId = frameMessage.id; } } if (frameMessage.mentionEveryone || frameMessage.mentions.Any(m => m.id == currentUserId)) { ReadStates[frameMessage.channelId].lastMentionId = frameMessage.id; if (selectedChannelId != null) { if (frameMessage.channelId != selectedChannelId) { ReadStates[frameMessage.channelId].mentionCount += 1; } } } if (Channels.ContainsKey(messageCreateFrame.data.channelId)) { Channels[messageCreateFrame.data.channelId].lastMessage = messageCreateFrame.data; } if (Channels.ContainsKey(frameMessage.channelId) && !Channels[frameMessage.channelId].isMute && frameMessage.author.id != currentUserId) { var userId = messageCreateFrame.data.author.id; var username = messageCreateFrame.data.author.fullName; var avatar = messageCreateFrame.data.author.avatar; var content = messageCreateFrame.data.content; var msgId = messageCreateFrame.data.id; var channelId = messageCreateFrame.data.channelId; var inChannel = messageCreateFrame.data.channelId == selectedChannelId; var notificationContent = ""; if (messageCreateFrame.data.type == "voice") { notificationContent = $"{username}: [语音]"; } else if (messageCreateFrame.data.attachments != null && messageCreateFrame.data.attachments.Count > 0) { var contentType = messageCreateFrame.data.attachments.first().contentType; if (contentType == "image/png" || contentType == "image/jpg" || contentType == "image/jpeg" || contentType == "image/gif") { notificationContent = $"{username}: [图片]"; } else { notificationContent = $"{username}: [文件]"; } } else { notificationContent = $"{username}: {ParseMessageToString(content, Users)}"; } UnityMainThreadDispatcher.Instance().Enqueue(() => NotificationManager.instance.ShowNotification( inChannel, userId, $"{Channels[channelId].name}", notificationContent, msgId, channelId, avatar, id => { var instance = _instance == null ? GetWindow <Window>("Messenger", typeof(SceneView)) : _instance; using (instance.window.getScope()) { HomePage.currentState.Select(id); } })); } }
static IEnumerable<Shovel.Callable> Udps () { var rng = new Random (); Action<Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> print = (api, args, result) => { if (args.Length > 0 && args [0].Kind == Shovel.Value.Kinds.String) { pageContent.Append ("<span>"); pageContent.Append (HttpUtility.HtmlEncode (args [0].String)); pageContent.Append ("</span>"); } }; Action<Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> printLn = (api, args, result) => { if (args.Length > 0 && args [0].Kind == Shovel.Value.Kinds.String) { pageContent.Append ("<span>"); pageContent.Append (HttpUtility.HtmlEncode (args [0].String)); pageContent.Append ("</span><br/>"); } }; Action<Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> readInt = (api, args, result) => { if (readState == ReadStates.None) { result.After = Shovel.UdpResult.AfterCall.NapAndRetryOnWakeUp; readState = ReadStates.ReadInteger; } else if (readState == ReadStates.ReadInteger) { int dummy; if (!int.TryParse (userInput, out dummy)) { dummy = 0; } result.Result = Shovel.Value.MakeInt (dummy); readState = ReadStates.None; pageContent.Append (HttpUtility.HtmlEncode (userInput)); pageContent.Append ("<br/>"); } else { throw new InvalidOperationException (); } }; Action<Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> readChar = (api, args, result) => { if (readState == ReadStates.None) { result.After = Shovel.UdpResult.AfterCall.NapAndRetryOnWakeUp; readState = ReadStates.ReadChar; } else if (readState == ReadStates.ReadChar) { var line = userInput; if (line.Length > 0) { result.Result = Shovel.Value.Make (line.Substring (0, 1)); } else { result.Result = Shovel.Value.Make (""); } readState = ReadStates.None; pageContent.Append (HttpUtility.HtmlEncode (userInput)); pageContent.Append ("<br/>"); } else { throw new InvalidOperationException (); } }; Action<Shovel.VmApi, Shovel.Value[], Shovel.UdpResult> random = (api, args, result) => { result.Result = Shovel.Value.MakeFloat (rng.NextDouble ()); }; return new Shovel.Callable[] { Shovel.Callable.MakeUdp ("print", print, 1), Shovel.Callable.MakeUdp ("printLn", printLn, 1), Shovel.Callable.MakeUdp ("readInt", readInt, 0), Shovel.Callable.MakeUdp ("readChar", readChar, 0), Shovel.Callable.MakeUdp ("random", random, 0), }; }
private static void ServeGuessNumberRequest (HttpListenerContext ctx) { ctx.Response.ContentType = "text/html"; userInput = ctx.Request.QueryString ["input"]; var bytecode = Shovel.Api.GetBytecode (ProgramSources ()); var vm = Shovel.Api.RunVm (bytecode, ProgramSources (), Udps (), shovelVmState); if (Shovel.Api.VmExecutionComplete (vm)) { shovelVmState = null; pageContent = new StringBuilder (); userInput = null; readState = ReadStates.None; vm = Shovel.Api.RunVm (bytecode, ProgramSources (), Udps (), shovelVmState); } shovelVmState = Shovel.Api.SerializeVmState (vm); using (var sw = new StreamWriter(ctx.Response.OutputStream)) { sw.Write ("<!DOCTYPE html>\n"); sw.Write (pageContent.ToString ()); sw.Write ("<form action='/' method='get'>"); sw.Write ("<input type='text' name='input' id='shovel-input'/>"); sw.Write ("<input type='submit' value='Submit'/>"); sw.Write ("</form>"); sw.Write ("<script>\n"); sw.Write ("document.getElementById('shovel-input').focus()\n"); sw.Write ("</script>\n"); } ctx.Response.OutputStream.Close (); }