예제 #1
0
        public static void Run()
        {
            Console.WriteLine("Converting ox emoji to UTF-16 and UTF-8");
            Rune rune = Rune.GetRuneAt("🐂", 0);

            Console.WriteLine($"Rune value: {rune.Value}");

            // <SnippetUtf16CharArray>
            char[] chars           = new char[rune.Utf16SequenceLength];
            int    numCharsWritten = rune.EncodeToUtf16(chars);

            // </SnippetUtf16CharArray>

            Console.WriteLine($"Number of chars: {numCharsWritten}");

            // <SnippetUtf16String>
            string theString = rune.ToString();

            // </SnippetUtf16String>

            // <SnippetUtf8ByteArray>
            byte[] bytes           = new byte[rune.Utf8SequenceLength];
            int    numBytesWritten = rune.EncodeToUtf8(bytes);

            // </SnippetUtf8ByteArray>

            Console.WriteLine($"Number of UTF-8 bytes: {numBytesWritten}");
        }
예제 #2
0
        [InlineData("x\U0001F46Ey", 1, 0x1F46E)] // U+1F46E POLICE OFFICER
        public static void GetRuneAt_TryGetRuneAt_Utf16_Success(string inputString, int index, int expectedScalarValue)
        {
            // GetRuneAt
            Assert.Equal(expectedScalarValue, Rune.GetRuneAt(inputString, index).Value);

            // TryGetRuneAt
            Assert.True(Rune.TryGetRuneAt(inputString, index, out Rune rune));
            Assert.Equal(expectedScalarValue, rune.Value);
        }
예제 #3
0
        public static void GetRuneAt_TryGetRuneAt_Utf16_BadArgs()
        {
            // null input
            Assert.Throws <ArgumentNullException>("input", () => Rune.GetRuneAt(null, 0));

            // negative index specified
            Assert.Throws <ArgumentOutOfRangeException>("index", () => Rune.GetRuneAt("hello", -1));

            // index goes past end of string
            Assert.Throws <ArgumentOutOfRangeException>("index", () => Rune.GetRuneAt(string.Empty, 0));
        }
예제 #4
0
        [InlineData(new char[] { 'x', '\uD800' }, 1)]                // end of string reached before could complete surrogate pair
        public static void GetRuneAt_TryGetRuneAt_Utf16_InvalidData(char[] inputCharArray, int index)
        {
            string inputString = new string(inputCharArray);

            // GetRuneAt
            Assert.Throws <ArgumentException>("index", () => Rune.GetRuneAt(inputString, index));

            // TryGetRuneAt
            Assert.False(Rune.TryGetRuneAt(inputString, index, out Rune rune));
            Assert.Equal(0, rune.Value);
        }
        private async Task HandleReactionAddedAsync(Cacheable <IUserMessage, ulong> reactionMessage, ISocketMessageChannel reactionChannel, SocketReaction reaction)
        {
            if (reaction.User.IsSpecified && reaction.User.Value.IsBot)
            {
                return;
            }
            var rune = Rune.GetRuneAt(reaction.Emote.Name, 0);

            var message = await reactionMessage.GetOrDownloadAsync();

            var menu = BotContext.Menus.FirstOrDefault(m => m.MessageID == message.Id);

            if (menu != null)
            {
                await message.RemoveReactionAsync(reaction.Emote, reaction.User.Value);
            }
            if (menu?.UserID == reaction.UserId && rune.Value >= ENCLOSED_A_INT && rune.Value < (ENCLOSED_A_INT + 26))
            {
                int i = rune.Value - ENCLOSED_A_INT;
                if (i < menu.Menu.Options.Count)
                {
                    var option = menu.Menu.Options[i];
                    var result = option.Action();
                    switch (result)
                    {
                    case string response:
                        await message.DeleteAsync();

                        await reactionChannel.SendMessageAsync("Menu Result: " + response);

                        BotContext.Menus.Remove(menu);
                        break;

                    case Menu submenu:
                        await message.RemoveAllReactionsAsync();

                        await message.ModifyAsync(m => m.Embed = MenuHandler.ConvertMenuToEmbed(submenu));

                        foreach (var o in submenu.Options)
                        {
                            await message.AddReactionAsync(new Emoji((new Rune(127462 + i++).ToString())), new RequestOptions { RetryMode = RetryMode.RetryRatelimit });
                        }
                        submenu.BackReference = menu.Menu;
                        menu.Menu             = submenu;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
            }
        }
        private static void TestUtf8String()
        {
            Rune rune = Rune.GetRuneAt("😃", 0);

            byte[] t = new byte[12];
            t[0] = (byte)'a';
            t[1] = (byte)'b';
            t[2] = (byte)'c';
            t[3] = (byte)'d';
            rune.EncodeToUtf8(t.AsSpan(4));
            t[8 + 0] = (byte)'e';
            t[8 + 1] = (byte)'f';
            t[8 + 2] = (byte)'g';
            t[8 + 3] = (byte)'h';

            var s = new Utf8Splitter(t, default, StringSplitOptions.None);