Mishiranu / Dashchan-Extensions

Dashchan extensions

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

#nulldvachin

lisanyan opened this issue · comments

I suck at intros..

В общем, если файл загружен на pomf.cat, то src получается вида
//a.pomf.cat/plapla.webm (линк без протокола)
и в итоге аппендится к домену борды.
В массиве файла есть ключ external_upload (1/0), можно по нему проверять, и не аппендить линк или добавлять к нему протокол (e.g. "https:" + //a.pomf.cat/plapla.webm).

Еще в апи пару новых фич добавила
Удаление постов теперь может отдавать json, параметр ajax=1 в запрос

{
   "error" : {
      "1325" : "Неверный пароль для удаления.",
      "1327" : "Неверный пароль для удаления.",
      "1292" : "Неверный пароль для удаления.",
      "766" : "Неверный пароль для удаления."
   },
   "error_code" : 200
}

При успешном удалении вернет
{ "redir" : "/b/thread/num" }
или если был удален тред
{ "redir" : "/b/" }

Еще желательно добавлять параметр parent с номером треда к delete task, если пост из треда удаляется, чтобы правильный редирект был.

Список борд теперь можно забирать по /board/api/getboards

Алсо, теги sup/sub в разметку можно добавить и инпут no_pomf (не грузить файлы на внешний сервер) в форму отправки (если не сложно).

Вроде почти всё сделал, кроме двух вещей.

Во-первых, мне не очень нравится апи списка досок т. к. они не упорядочены. Правильно отдавать массив объектов с полями "board_name" и "title", например. Или на сервере в принципе не предусмотрен порядок досок, а на страницах доски вбиты вручную?

Во-вторых, поддержку "no_pomf" добавить не получится. Модули тут бессильны, новые кнопочки-галочки можно добавлять только на стороне приложения. Я бы подумал насчёт добавления в приложение, но фича уж больно уникальная и, по моему мнению, не сильно востребованная.

Массив сейчас переделаю с сортировкой и ключами board_desc/board_name. На страницах вручную забиты, руки никак не дойдут допилить динамическую подгрузку досок.

Окей, no_pomf - не критично.

Так доски по алфавиту сортируются? Просто сортировать json-объект нет никакого смысла, потому что он в принципе не может быть упорядоченным, в любом случае стоит сделать массив.

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

Готово, сейчас нормально?

У меня что-то сайт вообще отвалился.

Сейчас вроде открывается, у хостера что-то с IO, диски оче медленно работают.

Так что, думаешь объектом всё таки оставить? А то я что-то не вижу разницы по сравнению с прошлым разом, лол.

Не. Т.е. мне просто data массивом сделать?

Да, всё верно. И к каждому элементу массива добавить ещё поле кода доски.

Интернеты отвалились :\

Что-то вроде

   "data" : [
      {
         "board_desc" : "Чятик для двоих",
         "board_key" : "a",
         "board_name" : "Аниме"
      },
    ]

получилось

Или так сделать?

   "data" : [
      "a" : {
         "board_desc" : "Чятик для двоих",
         "board_key" : "a",
         "board_name" : "Аниме"
      },
    ]

Первый вариант лучше. Короче, как сейчас — лучше всего.

Done.

Ок, тогда я всё сделал, сейчас обновлю.

Сек

Я думаю возврат апи удалялки тоже массивом сделать

Да это уже необязательно.

Ну ладно, тогда как есть оставлю. Спасибо.

Просто я уже закоммитил релиз, лол. Я могу откатить, конечно, просто стоит ли?

Ну если его легче парсить будет, то думаю да. Или инкремент версии сделать до 1.4 лучше

Алсо, delete еще это выдать может,

Тред закрыт
Неправильный IP - (посты можно удалять без пароля, если айпи клиента совпадает с ip поста)
Пост протух.

Или необязательно хандлить все сообщения?

Ну, мне разницы-то нет, но если хочешь сделать чтобы типа "нормально" было — давай. Выпущу как 1.4 потом.

Обработку этих сообщений тоже добавлю.

Только лучше не так, как сейчас

{
   "error" : [
      {
         "380" : "Неверный пароль для удаления."
      }
   ],
   "error_code" : 200
}

а как-то так например:

{
   "error" : [
      {
         "post_id": "380",
         "reason": "Неверный пароль для удаления."
      }
   ],
   "error_code" : 200
}

Кстати, вообще для апи рекомендую Content-Type отдавать application/json; charset=utf-8 вместо простого application/json.

Оке, просто переписывать историю коммитов не есть хорошо, если форки есть :D
Теперь такой вывод (наверное еще больше complicated :\ )

"error" : [
      {
         "error_msg" : "Неверный пароль для удаления.",
         "post" : "1331"
      },
   ],

Поправила Content-Type

Теперь post_id/reason в объекте

Алсо, клиент куки сохраняет которые с ответом сервера после постинга прилетели?

Нет. Что за куки и для чего они?

name, если в нейме есть трип который есть в дб, то можно постить на любых досках с неймом и без капчи (что-то вроде пасскодов, лол).

Не понял, а почему эта кука после постинга появляться должна?

Header set-cookie в ответе task=post.

Не, как куки работают я знаю. Я просто не могу понять, что она делать должна. Имя-то везде можно использовать, кроме некоторых досок, да и капчи тоже я нигде не видел.

/api/checkconfig проверяет через нее есть ли "специальный" трипкод из дб в имени, и возвращает captcha=0 и names_allowed=1 даже если постинг с неймом в конфиге отключен.

Но наверное нет смысла ковыряться с ней, оверкилл.

Капча есть у всех кроме /RU UA BY KZ EU/

Так погоди, эта кука же просто хранит последнее введённое имя, так? И при наличии куки просто немного меняется конфиг? То есть фактически мне не надо даже сохранять куку, а просто можно использовать введённое имя?

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

Йеп. Хмм, можно использовать последнее введенное имя, если оно где-то сохраняется, если надо могу инпут name к checkconfig добавить вместо печеньки.

Не, не обязательно, я без проблем смогу сделать чтобы с кукой передавалось.

А такой вопрос: например, я ввожу имя, которое есть в базе, отправляю пост, иду в d, ввожу там другое имя, снова отправляю пост. Таким образом, кука заменится, но пост отправится со вторым введённым именем?
Вообще было бы хорошо, если бы для тестирования для меня было бы заведено такое имя, хотя бы на время.

Пост отправится только если введено имя, которое в дб, иначе просто "Аноним". В функции постинга тоже проверка есть.

Оки, вот тестовый трип #TestCode

Я просто думаю, может, в таком случае, стоит оформить это как авторизацию? Дашчан поддерживает авторизацию пользователей.

Хм, можно. Может тогда отдельную куку для этих целей прикрутить (что-то вроде auth, трипкод прошел проверку -> сохранить этот трип в auth и проверять уже по куке auth)?

Имхо так лучше будет.

Да не обязательно, можно как есть оставить. Я вот так хочу сделать:

  1. В настройках надо ввести свой трипкод. Если он проходит авторизацию — сохраняю его.
  2. При открытии окна постинга проверяется наличие сохранённого в настройках трипкода. Если он есть — разрешаю отображение поля ввода имени.
  3. При отправке поста этот трипкод автоматически склеивается с введённым именем.

Да я все равно уже re-implementing this. Добавлю в чекконфиг инпут с auth и в ответ поле вроде check_success.

Мне идея со склеиванием не оче нравится, что если я введу другой трип в поле нейма?

И 2 пункт немного переделать можно будет

  • Отправляем checkconfig с инпутом (или кукой?) auth который содержит трип из настроек при обновлении доски.
    если names_allowed отдает 1 то поле ввода же само включается?

Мне идея со склеиванием не оче нравится, что если я введу другой трип в поле нейма?

if (name.indexOf('#') == -1) name += '#' + authorizedTripcode;

То есть теперь авторизация будет возможна отдельно от трипкода? Это, конечно, лучше.

Да.

Кука auth с трипом должна будет отправляться чекконфигу и функции постинга/удаления, сможешь реализовать?

Смогу. А с удалением что? Типа пароль не нужен?

Удаление без задержки как вариант.

Может функцию авторизации отдельно добавить? пока код еще редактирую

Готово

/api/authorize?auth=trip, только trip должен быть urlencoded, task=post с правильным трипом также авторизует (отдает куки auth)
/api/checkconfig теперь содержит поле authorized в объекте config

Лол, заодно обнаружил баг в приложении, в определённый момент ссылка декодируется и вся часть ссылки начиная с # считается фрагментом ссылки и не отправляется на сервер. Буду использовать пост-запрос, но баг устраню в следующей версии на будущее, разумеется.

Great.

Так, к authorize нельзя пост-запросом обращаться, только гет?

Хм, вроде фильтра никакого на нем нет, так что можно.

У меня чего-то не получается, выдаёт html страницу.

Так должно работать

<form id="postform" action="/wakaba.pl" method="post" enctype="multipart/form-data">
<input type="hidden" name="section" value="b">
<input type="hidden" name="task" value="json">
<input type="hidden" name="json" value="authorize">
<input type="text" name="auth" value="">
</forrm>

Лол, а я шлю запрос на b/api/authorize.
Попробую тогда.

rewrite правило /api/ не работает с POST запросами
Оки

Well, параметр task тут не нужен.

section, как оказывается, тоже. Ну это логично.

section == b, если нет аргумента.

Всё, выпустил 1.4 с поддержкой авторизации.

Thanks again

Хм, а флаги стран прикрутить можно? Поля location, location_full в объекте поста, geoip_enabled в конфиг объекте, флаги лежат в /img/flags/ (файлнеймы капсом)

И еще auth cookie добавить к /api/thread,/api/threads (клиент же оттуда берет конфиг?) и проверку c authorizedTripcode != null можно убрать тогда, если names_allowed будет отдавать 1.

И тут вроде должно быть
int attachmentCount = configObject.optInt("max_files", 4);
вместо
int attachmentCount = configObject.optInt("max_res", 4);

Хм, а флаги стран прикрутить можно?

Готово

и проверку c authorizedTripcode != null можно убрать тогда

Я, помню, специально делал именно так, как это сделано сейчас, но это было когда ещё кука auth не поддерживалась. Сейчас, наверное, можно убрать эту проверку.

И тут вроде должно быть

Точно, невнимательно копировал же. Сделал нормально.

Всё, заливать обновление, или ещё что-то?

Спасибо, пока вроде всё, заливай.

Залил.

Оки.

Можешь допилить хандлер чтобы показывал ip/причину/срок когда истекает(0 - never)?

Новый апи для банов (return функции поста)

бан as-сети

{
   "banned" : 1,
   "bans" : [
      {
         "showmask" : 0,
         "ip" : "94.242.58.252",
         "reason" : "AS Network is banned",
         "expires" : "0"
      }
   ],
   "error" : "Бан :&lt;",
   "error_code" : 200
}

обычный ip-бан

{
   "banned" : 1,
   "bans" : [
      {
         "network" : "94.242.58.252",
         "showmask" : 0,
         "ip" : "94.242.58.252",
         "reason" : "test",
         "setbits" : 32,
         "expires" : "1468527252"
      }
   ],
   "error" : "Бан :&lt;",
   "error_code" : 200
}

бан dnsbl

{
   "banned" : 1,
   "bans" : [
      {
         "showmask" : 0,
         "ip" : "176.10.104.240",
         "reason" : "This IP was listed in tor.dnsbl.sectoor.de blacklist!",
         "expires" : 0
      }
   ],
   "error" : "Найдена прокси.",
   "error_code" : 200
}

и еще печеньку auth добавь к /api/post.

Готово. Обновлять?

Сек, еще вопрос, можно у Icon менять размер шрифта/позицию текста или это в самом клиенте захардкожено?

Не понял. У иконки поста? Что за размер шрифта и позиция текста?

У меня на старой мобилке с низкоразрешением не влезала геоинфа в диалоге по клику на флаг (получалось что-то вроде RUSSIAN FEDERATION, SAINT PETERS), пришлось урезать строку до вида RU, Saint Petersburg.

Алсо, функция поста не всегда отдает поле banned, не будет exception из-за того что его нет, или лучше добавить его во все ошибки?

А, да, текст должен быть коротким и влезать в 1 строку. Оно на что-то более серьёзное не было рассчитано.

Алсо, функция поста не всегда отдает поле banned, не будет exception из-за того что его нет, или лучше добавить его во все ошибки?

int banned = jsonObject.optInt("banned", 0);

Не будет. Если оно отсутствует или оно не преобразуется в число — вернёт 0.

Тогда окей.

Поиск по борде еще можно прикрутить? /api/search
Параметры

find - строка для поиска
op - искать только в оп-постах
comment - поиск по тексту в посте (должен быть 1)
subject - поиск по теме

Тоже готово.

Thx~

Обновляй.

#crash
В общем, если я отключаю флажки на борде, и рефрешу полностью тред (который закешировался с флажками), то клиент вылетает.

Device: Sony Ericsson hallon (MT15i)
SDK: 18 (4.3.1)
Application: 1031 (2.8.0)
----------------------------------------
java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:299)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
    at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.NullPointerException
    at chan.content.model.Post.contentEquals(Post.java:559)
    at chan.content.model.Posts.pendingMerge(Posts.java:339)
    at com.mishiranu.dashchan.async.ReadPostsTask.doInBackground(ReadPostsTask.java:184)
    at com.mishiranu.dashchan.async.ReadPostsTask.doInBackground(ReadPostsTask.java:1)
    at android.os.AsyncTask$2.call(AsyncTask.java:287)
    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
    ... 3 more

Да, глупая ошибка. Попробуй удали пока что тред из кэша (или вообще кэш очисти), а я сейчас исправлю.

Это ошибка не в модуле, а в клиенте, так что только с его обновлением что-то изменится.

Оки.

Done.

Эх, я только подумал, что мне будет проще локально у себя их просто убрать для теста, и удалил прошлое сообщение... Ну да ладно.

Да я уже всё проверил.
На будущее — лучше создай issue у самого проекта, если подобный вылет происходит, расширение само по себе не может приводить к вылету (нет, ну может конечно, если постараться), а если всё таки приводит — это баг клиента.

Получилось пофиксить?

Alrighty.

Да, получилось.

API update

Новые поля в конфиге

max_comment_length //Maximum number of characters in a comment
max_field_length //Maximum number of characters in subject, name, and email
default_name //Дефолтный нейм (аноним итд)

Скорость борды (постов в час) - поле board_speed в boardinfo.

Печенька auth переименована в wakaauth

Алсо, категории борд можешь прикрутить? Только я не знаю как их лучше реализовать (чтобы динамически подгружалось), сейчас есть поле board_cat в объекте массива с досками.

Могу добавить пару строк, чтобы делать сплит по "|" в массивы

"info" : {
     "category_order" : "Обсуждения|Общее|Японская культура",
     "board_order" : "a|b|d|diy|elf|h|l|mg|mu"
}

Или добавить сортированные массивы

"info" : {
      "category_array" : [
         "Обсуждения",
         "Общее",
         "Японская культура"
      ],
      "board_array" : [
         "a",
         "b",
         "d",
         "diy",
         "elf",
         "h",
         "l",
         "mg",
         "mu"
      ],
}

UPD: Welp, думаю оставлю массивы
UPD: Алсо, добавь капкод мода

adminpost == 1 //capcode - Team
adminpost == 2 //capcode - Mod

max_comment_length

Точно максимальное число символов? Не байт?

Байт, но сейчас исправлю.

Печенька auth переименована в wakaauth

А b/api/authorize как работает? Его параметр тоже wakaauth называется или по прежнему auth?

Байт, но сейчас исправлю.

Лол, я сейчас в d пытался пост отправить, мне в качестве кода ошибки возвращалась длина строки. Я так и понял, что ты длину строки тестируешь.

Лол, я сейчас в d пытался пост отправить, мне в качестве кода ошибки возвращалась длина строки. Я так и понял, что ты длину строки тестируешь.

Да, лол.

Done, теперь чекает по символам.

Параметр по прежнему auth называется.

Готово всё. Обновлять?

Йеп.

Можешь альт. домен обновить?

02ch.info мертв, новый - buttflaps.pp.ua

Готово.

Сменили движок на meguca (на тохочане тоже), соотвественно апи поменялся, можешь запилить?

Описание здесь
Алсо у объекта треда еще поля sticky и locked, но в доке не описаны.