Перейти к содержимому
ov3rwrite

Мои наработки дискорд-клиента

Рекомендуемые сообщения

Решил я вдруг написать дискорд-клиент на основе интернет карты, гуи библиотеки @Zer0Galaxy и json либы на гитхабе. Спустя долгое время разработки я понял, что совсем ничего не умею, а проблемы появились даже на стадии вывода. Вообщем я решил выложить сюда свои наработки, так как то, что уже написано работает нереально медленно и через раз, а сохранить и показать задумку хочется.

 

Вкратце - это дискорд клиент, работающий на реквестах и без веб-сокетов(что и стало основной причиной того, что я это забросил), который умеет авторизовываться, выводить сервера, каналы и криво-косо выводить последнее сообщение в них

 

Также возникла проблема с русскими символами, вместо них оно выводит Unicode Escape Sequence в виде "u0422u0435"

 

Ссылку оставляю тут, делайте что хотите, надеюсь кто-нибудь поддержит задумку и я возьмусь за написание веб-сокетов :)

 

https://pastebin.com/Zfn7YCqT

 

Использовалось:

https://gist.github.com/tylerneylon/59f4bcf316be525b30ab

  • Нравится 1
  • Одобряю 1
  • Спасибо 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 18.11.2020 в 20:49, ov3rwrite сказал:

Также возникла проблема с русскими символами, вместо них оно выводит Unicode Escape Sequence в виде "u0422u0435"

Я погонял прогу... Ну можешь написать костыль, который переведет это чудо в lua-number, а потом ручками в UTF 8. В любом случае код, который выплевывает твоя прога похож на русские буквы в юникоде с небольшими исключениями.
Если мне не изменяет память чтобы перевести число после U в UTF 8 надо:
1) Перевести его в двоичный вид
2) Посчитать сколько байт тебе понадобится
3) Занести его туда по следующим правилам:
3.1) В первом байте начиная со старшего бита ввести столько единиц, сколько понадобится байт, завершив нулем, т.е 110 значит что символ двухбайтовый, а 11110 - четырехбайтовый.
3.2) Любой следующий байт начинается (1-старший бит) с 10
Просто вбить двоичный код полученный из числа в оставшиеся биты по порядку.
Программа красиво выплевывает ошибку HTTP:400 при неправильных учетных данных )

Изменено пользователем ZO125

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 18.11.2020 в 20:49, ov3rwrite сказал:

Также возникла проблема с русскими символами, вместо них оно выводит Unicode Escape Sequence в виде "u0422u0435"

Так а чо, пройдись регуляркой по этой стринге, и всё:

str = "Meow u0422u0435"

str = str:gsub("u(%d+)", function(code)
    return utf8.char(tonumber(code, 16))
end)

-- Meow Te

Если дискордыч всегда выдаёт 4 знака после "u", то разумнее будет воспользоваться паттерном "u(%d%d%d%d)" для более корректного декодирования ситуаций, когда после экранируемой последовательности следует обычная цифра, не входящая в неё. Например, "Meow u042215" (где 15 - просто текст)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
11 час назад, ECS сказал:

Так а чо, пройдись регуляркой по этой стринге, и всё:


str = "Meow u0422u0435"

str = str:gsub("u(%d+)", function(code)
    return utf8.char(tonumber(code, 16))
end)

-- Meow Te

Если дискордыч всегда выдаёт 4 знака после "u", то разумнее будет воспользоваться паттерном "u(%d%d%d%d)" для более корректного декодирования ситуаций, когда после экранируемой последовательности следует обычная цифра, не входящая в неё. Например, "Meow u042215" (где 15 - просто текст)

Спасибо огромное, буду использовать. И да, оно увы выдает не только 4 цифры, иногда бывают и 3, аля u043

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
6 часов назад, ov3rwrite сказал:

И да, оно увы выдает не только 4 цифры, иногда бывают и 3, аля u043

Вот уроды, а. Никакой стандартизации(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
21 час назад, ECS сказал:

Так а чо, пройдись регуляркой по этой стринге, и всё:

Банальный вопрос - а если придет сообщение без кириллицы, но с сочетанием буквы u и цифр? Кажется, должно приходить что-то еще, или же такие сочетания должны быть экранированы, так что не все так просто.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Avevad сказал:

Банальный вопрос - а если придет сообщение без кириллицы, но с сочетанием буквы u и цифр? Кажется, должно приходить что-то еще, или же такие сочетания должны быть экранированы, так что не все так просто.

В том и проблема. Обычно подобные вещи экранируются редко встречающимися в повседневном общении комбинациями символов (по типу эмодзи 😀 у ВК). Тут вообще жесть какая-то. Мб у дискорда есть иные опции по экранированию юникода - эт уже вопрос к топикстартеру, ибо у него по ТЗ идет только uКод. Ну и ответ я дал соответственный

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, ECS сказал:

В том и проблема. Обычно подобные вещи экранируются редко встречающимися в повседневном общении комбинациями символов (по типу эмодзи 😀 у ВК). Тут вообще жесть какая-то. Мб у дискорда есть иные опции по экранированию юникода - эт уже вопрос к топикстартеру, ибо у него по ТЗ идет только uКод. Ну и ответ я дал соответственный

Нет, это вообще странно. Это не апи проблема, я с постмана чекал, там все ок. Это толи internet api чета крутит либо что то еще из OC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, ov3rwrite сказал:

Это толи internet api чета крутит либо что то еще из OC.

О, это уже интересно. Наверняка json-либа при конвертации в луа-таблицу автоматом эскейпит символы, либо как-то по-своему обрезает экранированный результат от API. Если дело в ней, то сменить либу не будет проблемой. К примеру, с этой проблем не возникало

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
11 час назад, ECS сказал:

О, это уже интересно. Наверняка json-либа при конвертации в луа-таблицу автоматом эскейпит символы, либо как-то по-своему обрезает экранированный результат от API. Если дело в ней, то сменить либу не будет проблемой. К примеру, с этой проблем не возникало

А черт его знает. Мб дело и правда в ней.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 21.11.2020 в 02:01, ECS сказал:

О, это уже интересно. Наверняка json-либа при конвертации в луа-таблицу автоматом эскейпит символы, либо как-то по-своему обрезает экранированный результат от API. Если дело в ней, то сменить либу не будет проблемой. К примеру, с этой проблем не возникало

Нет, все таки с чем то еще беды.

Dreamfinity64_2xYMe8dZVU.png.e30b787cb42c51e2bc67d3c8aa8d1f01.png

 

Dreamfinity64_XfEsMZIAiJ.png.999d9244c92f38e95281995f6be81d79.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, ov3rwrite сказал:

Нет, все таки с чем то еще беды.

С чем? Судя по скринам, парсинг абсолютно корректен

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 минут назад, ECS сказал:

С чем? Судя по скринам, парсинг абсолютно корректен

Чем-то другим*

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Проверил raw-ответ через сокет. API дискорда отдаёт сразу экранированные символы, либы опенкомпов тут ни при чём. Видимо, постман (как и ARC, кстати) сам их декодирует в русский эквивалент, из-за чего возникло подозрение на опенкомпы: 

 

image.png.c182dedd7592f35b1f65197cdf8c4feb.png

 

Значит, решение с регуляркой остаётся верным. Или нужно модифицировать JSON-либу соответственным образом, но всё равно используя ручной декодинг

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, ECS сказал:

Проверил raw-ответ через сокет. API дискорда отдаёт сразу экранированные символы, либы опенкомпов тут ни при чём. Видимо, постман (как и ARC, кстати) сам их декодирует в русский эквивалент, из-за чего возникло подозрение на опенкомпы: 

 

image.png.c182dedd7592f35b1f65197cdf8c4feb.png

 

Значит, решение с регуляркой остаётся верным. Или нужно модифицировать JSON-либу соответственным образом, но всё равно используя ручной декодинг

 

Только я протестил и почему-то оно одну часть слова кодирует верно, а другую нет, хотя на том же Lua Demo оно работало прекрасно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пардон, мой косяк. Не указал, что в регулярке нужно юзать шестнадцатеричную систему:

str:gsub("\\u([a-fA-F%d]+)", function(code)
    return unicode.char(tonumber(code, 16))
end)

Проверил в кубаче, всё пашет:

image.png.a725a2335456ff7ed73baab964e21ed4.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
10 часов назад, ECS сказал:

str:gsub("\\u([a-fA-F%d]+)", function(code)

    return unicode.char(tonumber(code, 16))

end)

Если не ошибаюсь, существует шаблон для шестнадцатеричных символов - %x

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, Zer0Galaxy сказал:

Если не ошибаюсь, существует шаблон для шестнадцатеричных символов - %x

Кстати, \u вроде добавили только в Lua 5.3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
13 часа назад, ECS сказал:

Пардон, мой косяк. Не указал, что в регулярке нужно юзать шестнадцатеричную систему:


str:gsub("\\u([a-fA-F%d]+)", function(code)
    return unicode.char(tonumber(code, 16))
end)

Проверил в кубаче, всё пашет:

image.png.a725a2335456ff7ed73baab964e21ed4.png

Спасибо, надеюсь скоро возьмусь за проект, стоит ли тему новую создавать ради этого?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
28 минут назад, ov3rwrite сказал:

Спасибо, надеюсь скоро возьмусь за проект, стоит ли тему новую создавать ради этого?

Ради чего?

 

Если новая тема будет посвящена очередному этапу разработки, то нет, создавать новую тему не стоит.

Если же в новая тема будет содержать описание готовой программы и ссылку на рабочий код, то это имеет смысл.

 

Предлагаю пока что продолжить обсуждение в этой теме. А новую тему создать, когда уже появится что-то пригодное к использованию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...