Это вопрос о том, насколько возможно кастомизировать функциональность Discourse и насколько масштабной может оказаться эта задача.
Я работаю в технической команде организации профессиональных писателей-фантастов, которая в основном базируется на программном обеспечении для форумов, созданном ныне ушедшим основателем. Оно работает на устаревшей связке ASP.NET Core, an open-source web development framework | .NET Server, и мы стремимся мигрировать на другую платформу.
Одной из самых популярных функций этого ПО является функция критики произведений. Пользователи могут загружать документ с указанием названия и количества слов. Существует специальная страница, где отображаются все истории, ожидающие обратной связи. В ПО реализована небольшая система геймификации: загрузка истории автоматически создаёт тему обсуждения, а любой пользователь, опубликовавший ответ длиной более 750 символов, получает очки. Когда пользователь получает достаточное количество ответов, он может запретить другим скачивать файл.
На странице загрузки истории рядом с именем каждого пользователя отображается количество заработанных им очков критики и количество очков, полученных его историями. Предполагается, что эти показатели должны быть примерно сбалансированы, но всё держится на честном слове; насколько мне известно, никого никогда не предупреждали за получение критики без предоставления таковой. Всё работает довольно хорошо (за исключением устаревшей и ненадёжной технической основы, о которой говорилось выше).
Долгосрочные пользователи иногда набирают впечатляющее количество кредитов, и мы очень хотим перенести эти данные на новую платформу, а не обнулять чьи-либо рекорды.
Мой вопрос: насколько просто будет внедрить подобный функционал в форум Discourse? Скорее всего, это будет в рамках возможностей отдельного плагина, или же нам потребуется отдельное приложение, взаимодействующее с Discourse через API? Буду благодарен за любые рекомендации.
Это должно быть реализуемо в виде плагина. Очки можно хранить как пользовательское поле для тем, постов и/или пользователей.
Несколько вопросов для уточнения функциональности:
Получаются ли эти очки исключительно на основе длины ответа?
Как определяется понятие «достаточно»?
Предполагаю, что под «файлом» имеется в виду история? Нужно ли им предпринимать явное действие? То есть есть ли кнопка «запретить людям скачивать файл», которая разблокируется после получения «достаточно ответов»?
Как определяется количество (очков?), которое получает история?
Любой ответ длиннее 750 символов получает баллы (в теме с критикой можно сделать пост без критики, включив фразу «Это не пост с критикой», но, насколько я знаю, такое никогда не использовалось). Если автор публикует пост длиннее 750 символов в своей собственной теме с критикой, это не должно приносить никаких баллов.
Решает автор истории. Он может сам решить, когда получил достаточно обратной связи по своей истории.
Да, файл — это история (документ Word, файл RTF или другой формат). Есть кнопка, которую автор может нажать в любой момент, чтобы отключить дальнейшие загрузки. Он может нажать её даже до того, как кто-либо скачает файл, если передумает делиться историей.
Вместо того чтобы пытаться это обобщить, вот SQL-запрос:
CASE WHEN WordCount < 1001 THEN 0.5
WHEN WordCount BETWEEN 5000 AND 9999 THEN 1.5
ELSE Round([WordCount] / 10000, 0) + 1 END
На практике люди редко загружают истории объёмом более 10 тысяч слов.
Как сказал Ричард, в плагине возможно всё. То, что вы предлагаете, скорее всего, займёт несколько часов работы. Возможно, есть способы сократить расходы, чтобы уложиться в ваш бюджет. Также могут помочь пользовательские значки. Вы определённо можете заказать разработку нового плагина, а затем импортировать в него данные во время миграции.
Не путайте копирование старой системы с созданием лучшей.
Вы можете использовать уже готовый плагин или теги, чтобы отключить время на проверку отзывов.
Если вся ваша система разработана на заказ, создание кастомного импортера обычно стоит около 1500 долларов, и, скорее всего, вам понадобится ещё примерно столько же для необходимого плагина.
Вы также можете перестать различать кредиты за историю и за критику и просто переиспользовать функцию «Нравится» в Discourse (отправка сердечек) как функцию обмена кредитами. Это сделало бы миграцию и реализацию довольно простыми. Но, возможно, я упускаю преимущество разделения кредитов?
Суть в том, что вы возвращаете что-то сообществу. Если другие читают вашу работу и дают вам обратную связь о том, как её улучшить, вы тоже должны читать работы других и давать им обратную связь. Было бы здорово, если бы это можно было отслеживать с помощью встроенной функции Discourse, но я не вижу, как это сделать.
Вы можете выполнять более детальные запросы по лайкам, которые получают пользователи. Например, можно различать лайки за публикацию историй и за обмен отзывами, выполняя запросы к лайкам на начальном и последующих постах в категории «Истории».
Затем вы можете разработать значки (вместе с названиями пользователей и флейрами), которые будут присуждаться при достижении определённых количеств.
Проблема, насколько я понимаю, в том, что лайки служат показателем популярности поста, тогда как система, которую я пытаюсь мигрировать, предназначена для отслеживания того, достигли ли пользователи базового уровня активности. Поэтому, если бы было возможно автоматически ставить лайк ровно один раз любому посту в ветке истории, который содержит больше определённого количества символов и написан не автором истории, это подошло бы для нашей системы. Однако это, похоже, не совсем соответствует тому, как работают лайки.