I have been updated some featured/pinned topics and they seem to be sending out updates every time that I update them. Is there a way to disable this? “Watch first Post” shouldn’t trigger if the post is just slightly edited as far as I can tell?
What do you mean by “I have been updated”? What exactly did you do, step by step? Describe it in detail? Your question is unanswerable until you provide this information.
Edits don’t alert anyone in Discourse… ever, that I can think of. You will be notified if someone else edits your post by default, using the typical Discourse notifications.
Edits notify the original author. I get notifications when @codinghorror fixes my posts with alarming frequency. (I don’t think it’s what this person is describing, but it is edits giving notifications)
Sorry fort he lack of clarity.
For some reason, editing a post that I created would notify other users of the edit. It appears that it occurred in topics that used the tagging of a group and that group would be notified (even if the tag was not a new one).
Create a post with multiple tags of groups of members
Let it propagate and send notifications. Wait whatever number of minutes is needed for it to send out to any current watch lists/etc.
Come back to the post and edit it.
Add something useless, like the word unicorn and note that the right hand side of the edit window alerts that you will notify the groups in the post despite not having added or edited anything to do with those tags.
Save
Check the logs and note that all members in those groups are now notified of the edit (though the notifications appear as a New Topic notification.
I have not been able to repro this. I tested it on try, with 3 users. In one post I mentioned all of them individually, in the other I mentioned a group all 3 were in. They all received the initial mention notification, they did not receive further notifications on edit.
I’m unsure about the type of notification here. Are you referring to a notification that appears on your user profile, i.e., as an extra entry in the list that appears when you click on your avatar up right?
Or is it a small blue dot next to the topic title in the topic list?
Хм, @Grayden_Shand, я предполагаю, что в сообщении упоминание группы уже было указано до редактирования? Я знаю, что если вы добавляете новое упоминание в сообщение через редактирование, то этот пользователь или группа получают уведомление.
Я протестировал два сценария:
Если вы делаете «ниндзя-редактирование» сообщения, в котором уже было упоминание группы, предупреждение отображается во время редактирования, но после завершения «ниндзя-редактирования» уведомление не отправляется.
Если вы редактируете сообщение после истечения периода прощения ошибок (grace period), предупреждение отображается во время редактирования, но новое уведомление группе не отправляется.
Не могли бы вы предоставить дополнительные шаги для воспроизведения проблемы?
Кстати, было бы полезно иметь переключатель, который контролирует, должно ли упоминание вызывать уведомление на уровне сообщения. Это дало бы больше контроля в сценариях редактирования, а также в случаях, когда вы просто хотите включить магическую ссылку на карточку пользователя или профиль в сообщение для использования другими участниками.
Уведомление отправляется пользователям, которые присоединились к группе после создания поста.
Таким образом, для пользователей, получающих уведомление, это первый раз, когда ПОЛУЧИЛИ упоминание, но не первый раз, когда КТО-ЛИБО получил уведомление.
Однако пользователи, которые были в группе изначально (и получили первоначальное уведомление об упоминании), не получают дополнительного уведомления при редактировании.
Шаги для воспроизведения (требуется два пользователя)
Создайте новую группу.
Создайте новый пост или тему с упоминанием этой группы.
Создайте нового пользователя.
Добавьте этого пользователя в группу.
Отредактируйте пост — на этом этапе новый пользователь получит уведомление.
Отредактируйте пост снова — новый пользователь не получит дополнительных уведомлений за последующие правки.
Не уверен, какое поведение здесь было бы правильным… Думаю, я склоняюсь к тому, чтобы вообще не отправлять уведомления об упоминаниях при редактировании, но не знаю, насколько сложно это реализовать.
Также ещё один момент — сообщение «Вы собираетесь уведомить X человек в группе» появляется при редактировании, независимо от того, будут ли фактически уведомлены какие-либо пользователи.
Возможно ли привязать это предупреждающее сообщение к количеству людей, которые ранее не были уведомлены об этом посте (чтобы рассчитать точное количество людей, которые получат уведомление)?
Отправка уведомлений об упоминаниях при редактировании поста — важная функция, которую, как я знаю, использую я и другие время от времени, поэтому мы хотим сохранить её. Однако то, как она работает с группами, кажется неправильным.
На данный момент я считаю, что группу нужно уведомлять только один раз за пост. Пользователи, добавленные в группу после первоначального упоминания группы, не должны получать уведомление об упоминании группы в результате последующих редактирований поста. Баннер JIT-обучения об уведомлении группы не должен отображаться при редактировании поста, если с момента последнего сохранения поста не было новых упоминаний группы.
Если в редактировании упоминается группа, которая ранее не упоминалась, они должны быть уведомлены. Так работает система уведомлений для упоминаний пользователей. Мы также должны видеть соответствующий обучающий баннер, если упоминается новая группа.
Я думаю, мы можем просто добавить условную логику на основе наличия записи в таблице group_mentions. Запись создаётся в момент сохранения поста.
Я согласен, но действительно ли мы должны считать это ошибкой, которую нужно исправить?
Если мы полностью подавим все уведомления @group при редактировании, то при редактировании нового @group не будет уведомления об упоминании. Это станет значительным изменением по сравнению с тем, как работали уведомления ранее, и может вызвать удивление.
Если же мы начнем усложнять логику и уведомлять только о новых @group при редактировании, нам придется поддерживать сложный код, который должен анализировать различия и вести дополнительный учёт.
Я точно не могу придумать никакого простого решения здесь.
Итак, представьте пост с тремя разными упоминаниями групп. Он редактируется, и добавляется четвертое упоминание.
При сохранении правки мы можем использовать такой запрос, чтобы получить текущий список упоминаний групп для этого поста:
-- [params]
-- text :post_id
select gm.group_id, g.name
from group_mentions gm
join groups g on (gm.group_id = g.id)
where post_id = :post_id
Затем, сравнивая результаты запроса со списком групп, упомянутых в посте, мы можем найти новое упоминание (или новые упоминания).
Это не кажется слишком сложной вычислительной задачей, но, возможно, я упускаю что-то очевидное. Также это выглядит как задача, которую можно выполнять в фоновом режиме.
Что касается JIT-баннера об уведомлении группы (групп), то, возможно, эту логику можно было бы вынести в отдельный API-эндпоинт (/post/<id>/mentions.json) для асинхронного получения этих данных.
Разве не проще создать новую тему и уведомить людей таким образом? Я немного опасаюсь строить здесь башню сложности для поддержки довольно узкого частного случая.
Я просмотрел часть кода для этого (спасибо @tshenry за ссылку), и кажется, что это не должно быть так запутанно.
Упоминания групп сейчас срабатывают здесь (строки 78–80). Функция expand_group_mentions() — это генератор, отвечающий за выдачу пользователей, которым должны прийти уведомления об упоминании группы (с учётом таких политик, как SiteSetting.max_users_notified_per_group_mention).
Это кажется естественным местом для размещения такой логики.
В функции create_notificationмы подавляем уведомления для тех, кто уже получил уведомление того же типа. Именно поэтому редактирование поста с упоминанием группы вызывает уведомление для новых участников группы — уведомление фактически генерируется для всех пользователей группы, но затем подавляется для тех, кто уже его получил.
Я предлагаю нечто подобное: обновить функцию expand_group_mentions(), чтобы она также исключала группы, у которых уже есть запись в таблице group_mentions.
Что-то вроде этого (извините за незнание синтаксиса Ruby):
def expand_group_mentions(groups, post)
return unless post.user && groups
Group.mentionable(post.user, include_public: false).where(id: groups.map(&:id)).each do |group|
next if group.user_count >= SiteSetting.max_users_notified_per_group_mention
# Добавить проверку на группы, которые уже были упомянуты
next if GroupMentions.where(group_id: group.id, post_id: post.id).length > 0
yield group, group.users
end
end
Однако это не решает проблему предупреждения JIT.
Пытаюсь помочь решить эту задачу, дайте знать, если я просто надоедаю…
Я собирался задать новый вопрос в поддержку, но наткнулся на эту тему.
Кажется, она связана с моим вопросом.
Если я опубликую сообщение и пойму, что забыл уведомить некоторых людей, какой у меня будет лучший вариант?
Отредактировать пост и конкретно упомянуть (@) группу или нескольких людей?
Создать новое сообщение для уведомления (@)? Тогда мне придется повторить много информации или добавить ссылку на исходный пост.
Если возможно, я бы предпочел вариант 1 (он чище)?
Может ли кто-нибудь подтвердить: будут ли конкретные упоминания (@) отдельных лиц или групп при редактировании уведомлять их, если они еще не были уведомлены? Если нет, то это звучит как полезная функция, если её не слишком сложно реализовать?
P.S. Если я забываю, иногда использую настраиваемое временное окно для редактирования поста до отправки уведомлений. Но к тому времени, как вы это сделаете, никогда не знаешь точно, успеешь ли ты. Ты узнаешь, что пост был отредактирован, только когда редактирование будет опубликовано.
Я использую это редактирование, чтобы проверить, получу ли я уведомление @Rhidian@codinghorror