Exemple #1
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();
        }
Exemple #2
0
        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;
                    }
                }
            }
        }
Exemple #4
0
        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);
                    }
                }));
            }
        }
Exemple #6
0
 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),
     };
 }
Exemple #7
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 ();
 }