主题 OP 管理插件

继续关于“用户可以在自己的主题上充当版主”的讨论:

该插件现已基本开发和测试完毕。

功能

我不太喜欢解释它的功能,所以我决定用图片来展示它的作用。

用户

管理群组

管理员

重要提示

安装后,请按照以下说明操作,然后再启用插件

  • 在启用此插件之前,您需要创建一个帐户作为“用户助手机器人”。虽然此插件可以自动创建机器人用户或使用现有的 @Discobot,但我建议不要这样做,因为插件创建的机器人用户无法在管理面板中修改。您可以授予它任何您想要的权限,因为实际上,相关代码是专门编写的,以使机器人始终充当管理员,但我建议最好授予它管理员或版主权限。在开发过程中,有时由于这个原因会出现我无法稳定重现的未知错误。

  • 然后,您需要创建一个主题,它可以是私信或公开主题。将其 topic_id 填入 SiteSetting.topic_op_admin_logger_topic。如果启用了 topic_op_admin_enable_topic_log,上述机器人将在主题中创建更详细的日志帖子。

  • 创建用户助手机器人后,记下其用户 ID,然后将其填入上面的 SiteSetting.topic_op_admin_bot_user_id

  • 如果不按照上述步骤正确打开某些设置,可能会导致错误甚至破坏您的网站

18 个赞

您是否考虑过将机器人与类别版主组关联?在我看来,将其设为完整版主/管理员可能存在风险。

有几个插件曾被标记为实验性插件,直到它们被认为已度过开发阶段,例如“Who’s Online”。

也许 @Canapin 可以查看一下类别并与您讨论。

干得好,祝开发顺利!

我想我们是否应该在 Plugin 中添加“Alpha”和“Beta”标签? :thinking:

这样可以更容易地找到新插件,也能反映出安装它们所承担的风险……

3 个赞

插件是与 Discourse 一起运行的代码。机器人拥有任何权限(从管理员到 TL0)都没有问题,因为它实际上只是一个代码操作对象,并且拥有无限的权限。

事实上,我现在已经完成了插件的这部分开发。但我会谨慎地将此插件发布到 Plugin,因为插件(而非主题组件)出错可能会导致更灾难性的后果。

我将在插件在我的论坛上发布并经过一段时间的验证后正式发布它。

3 个赞

此插件已基本开发和测试完毕。现在您可以放心地安装它!
(但请遵循上方写的步骤:

5 个赞

@Lhc_fl 这看起来非常有用,但它是否允许楼主在自己的主题被关闭时像版主或管理员一样发帖?对我们来说,这似乎比让他们解锁、发帖然后重新锁定的流程要好得多。

1 个赞

我计划添加此功能,但我最近很忙,没有太多时间查看我的插件。任何有兴趣的人都可以提交一个拉取请求。

2 个赞

@Lhc_fl
这个插件很不错,

  • 能否将其制作成一个主题组件?这样会有更多人能使用它,
    我们没有权限在实例上安装插件,但可以安装主题组件。

  • 能否将“拆分和合并主题”添加到权限列表中?
    谢谢……

不行,这是不可能的,因为它需要与数据库进行交互。

也许可以,但这更难。我最近没有精力为它添加新功能。

3 个赞

抱歉,由于 ember.js 的升级,此插件与新版 discourse 不兼容,但我现在太忙了,无法修复。如果有人愿意修复,请在 Github 上提交 PR。

3 个赞

我今天升级了这个插件以适应新的 discourse 版本。现在该插件不再#损坏

9 个赞

我已启用“用户自主性插件”,但在提交请求后出现错误

这是浏览器终端中的日志


chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:393
SyntaxError: 非法字符 '<',"<!DOCTYPE "... 不是有效的 JSON
    at D.parse [as parseJSON] (<anonymous>)
    at l (chunk.7b3110aa5b5be8…1d8cd9.js:393:63167)
    at p (chunk.7b3110aa5b5be8…1d8cd9.js:393:63847)
    at k (chunk.7b3110aa5b5be8…41d8cd9.js:308:3688)
    at w (chunk.7b3110aa5b5be8…41d8cd9.js:308:3581)
    at f (chunk.7b3110aa5b5be8…41d8cd9.js:308:3077)
    at invoke (chunk.7b3110aa5b5be8…1d8cd9.js:121:10063)
    at m.flush (chunk.7b3110aa5b5be8…41d8cd9.js:121:9140)
    at g.flush (chunk.7b3110aa5b5be8…41d8cd9.js:121:11012)
    at q._end (chunk.7b3110aa5b5be8…41d8cd9.js:121:16062)
    at q.end (chunk.7b3110aa5b5be8…41d8cd9.js:121:13189)
    at q._run (chunk.7b3110aa5b5be8…41d8cd9.js:121:16576)
    at q.run (chunk.7b3110aa5b5be8…41d8cd9.js:121:13722)
    at c (chunk.7b3110aa5b5be8…41d8cd9.js:161:53419)
    at t.error (chunk.7b3110aa5b5be8…d8cd9.js:302:131483)
    at l (chunk.7b3110aa5b5be8…1d8cd9.js:191:58317)
    at Object.fireWith [as rejectWith] (chunk.7b3110aa5b5be8…1d8cd9.js:191:59062)
    at C (chunk.7b3110aa5b5be8…41d8cd9.js:194:5783)
    at XMLHttpRequest.<anonymous> (chunk.7b3110aa5b5be8…41d8cd9.js:194:8211)
l	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:393
p	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:393
k	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:308
w	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:308
f	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:308
invoke	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
flush	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
flush	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
_end	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
end	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
_run	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
run	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
c	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:161
t.error	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:302
l	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:191
fireWith	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:191
C	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:194
<anonymous>	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:194
XMLHttpRequest.send		
send	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:194
ajax	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:194
o	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:302
<anonymous>	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:308
e	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:308
D	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:302
submit	@	request-op-admin-form.js:106
<anonymous>	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:421
invoke	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
flush	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
flush	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
_end	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
end	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
_runExpiredTimers	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
setTimeout		
setTimeout	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
_installTimerTimeout	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
_reinstallTimerTimeout	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
_later	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
later	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:121
T	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:161
_triggerAction	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:421
click	@	chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:421