Lhc_fl
(Linca)
12.Ноябрь.2023 12:16:54
1
Теперь, когда PostCreator может указывать user как автора поста и guardian для проверки прав на публикацию, я хотел бы, чтобы Discourse Chat обладал аналогичной функциональностью. Это позволит плагинам отправлять сообщения от имени пользователя (независимо от того, состоит ли он в чат-канале или нет), используя права системного пользователя.
channel.membership_for(guardian.user)
end
def fetch_reply(params:)
Chat::Message.find_by(id: params.in_reply_to_id)
end
def ensure_reply_consistency(channel:, params:, reply:)
return true if params.in_reply_to_id.blank?
reply&.chat_channel == channel
end
def fetch_thread(params:, reply:, channel:, options:)
return Chat::Thread.find_by(id: params.thread_id) if params.thread_id.present?
return unless reply
reply.thread ||
reply.build_thread(
original_message: reply,
original_message_user: reply.user,
channel: channel,
force: options.force_thread,
Использование: В Discourse Automation и мосте для чата необходимо отправлять сообщения из плагина. Однако в настоящее время этот скрипт, скорее всего, не будет отправлен, так как указанный вами пользователь (например, DiscoBot) может не состоять в канале.
Some time ago, we encountered a problem with Discourse-Automation where we could not send chat messages regularly. We use it to send weekly news in the chat channel. I noticed in the /logs that chat messages failed to send due to permission issues.
I think the sender configured in discourse automation should simply ignore the channel’s permission settings, since this is set by the administrator. In fact, I am using DiscoBot as the messaging user. Since DiscoBot was not active in the category bo…
script do |context, fields, automation|
sender = User.find_by(username: fields.dig("sender", "value")) || Discourse.system_user
channel = Chat::Channel.find_by(id: fields.dig("chat_channel_id", "value"))
placeholders = { channel_name: channel.title(sender) }.merge(context["placeholders"] || {})
creator =
::Chat::CreateMessage.call(
chat_channel_id: channel.id,
guardian: sender.guardian,
message: utils.apply_placeholders(fields.dig("message", "value"), placeholders),
)
if creator.failure?
Rails.logger.warn "[discourse-automation] Chat message failed to send:\n#{creator.inspect_steps.inspect}\n#{creator.inspect_steps.error}"
end
end
end
end
Я понимаю, что команда очень занята, поэтому я могу сделать это сам. Надеюсь, команда Discourse сочтет возможным добавить эту функцию в ядро, и тогда я потрачу время на внесение изменений в код и отправлю pull request.
1 лайк
Discourse Chatbot решил аналогичную задачу с помощью текущего кода без необходимости каких-либо изменений в ядре. Вы уже посмотрели моё решение?
module ::DiscourseChatbot
class MessageReplyCreator < ReplyCreator
def initialize(options = {})
super(options)
end
def create
::DiscourseChatbot.progress_debug_message("5. Creating a new Chat Nessage...")
begin
Chat::CreateMessage.call(
chat_channel_id: @topic_or_channel_id,
guardian: @guardian,
message: @message_body,
)
presence = PresenceChannel.new("/chat-reply/#{@topic_or_channel_id}")
presence.leave(user_id: @author.id, client_id: "12345")
::DiscourseChatbot.progress_debug_message("6. The Message has been created successfully")
rescue => e
1 лайк
Lhc_fl
(Linca)
14.Ноябрь.2023 02:36:15
3
Большое спасибо за ваше предложение! Давайте посмотрим.
j.jaffeux
(Joffrey Jaffeux)
04.Декабрь.2023 19:53:45
4
Да, как отметил @merefield , сервис чата принимает гаранта, и вы можете установить гаранта по своему усмотрению.
1 лайк
j.jaffeux
(Joffrey Jaffeux)
Закрыл(а) тему
08.Декабрь.2023 19:54:16
5
Эта тема была автоматически закрыта через 4 дня после последнего ответа. Новые ответы больше не принимаются.