게시물 작성자(OP) 관리 플러그인

다음 링크에서 이어지는 토론입니다: 사용자가 자신의 주제에서 관리자 역할을 수행할 수 있는 기능:

이 플러그인은 이제 기본적으로 개발 및 테스트를 마쳤습니다.

기능

기능 설명을 글로 자세히 쓰는 것보다는 이미지로 보여드리는 것이 더 좋겠다고 생각했습니다.

사용자

  • 공개 주제의 생성자에게 주제 관리자 버튼 바로 뒤에 버튼이 나타납니다.
  • 필요 없다고 생각하여 개인 메시지(PM)는 지원하지 않습니다.
  • 모든 사용자는 관리자 권한을 얻기 전에 신청해야 하지만, 신청은 자동으로 승인될 수 있습니다.

  • 신청 후, 관리자 버튼이 나타납니다.

그룹 조작

관리자

중요한 참고 사항

설치 후, 플러그인을 활성화하기 전에 아래 지시를 따르십시오

  • 이 플러그인을 활성화하기 전에 "사용자 어시스턴트 봇"으로 사용할 계정을 생성해야 합니다. 이 플러그인은 봇 사용자를 자동으로 생성하거나 기존 @Discobot을 사용할 수 있지만, 플러그인이 생성한 봇 사용자는 관리자 패널에서 수정할 수 없으므로 권장하지 않습니다. 봇에게 원하는 권한을 부여할 수 있습니다. 왜냐하면 관련 코드는 봇이 항상 관리자(Admin)로 행동하도록 특별히 작성되어 있기 때문입니다. 그러나 관리자 또는 모더레이터 권한을 부여하는 것이 가장 좋습니다. 개발 중, 이 이유 때문에 안정적으로 재현할 수 없는 미지의 버그가 가끔 발생하기도 합니다.

  • 그런 다음, 주제를 생성해야 합니다. 이는 개인 메시지 또는 공개 주제일 수 있습니다. 그 주제의 topic_id를 SiteSetting.topic_op_admin_logger_topic에 입력하십시오. topic_op_admin_enable_topic_log가 켜져 있으면, 위의 봇이 해당 주제 내에서 더 자세한 로그 게시물을 생성합니다.

  • 사용자 어시스턴트 로봇을 생성한 후, 그 사용자 ID를 기록하고 위에서 언급한 SiteSetting.topic_op_admin_bot_user_id에 입력하십시오.

  • 위 단계에 올바르게 따르지 않고 특정 설정을 활성화하면 오류가 발생하거나 심지어 웹사이트가 손상될 수 있습니다

18개의 좋아요

봇을 카테고리 모더레이터 그룹에 연결할 수 있는지 확인해 보셨나요? 전체 Mod/Admin 권한을 부여하는 것은 위험할 수 있다고 생각합니다.

Who’s Online과 같은 일부 플러그인은 개발 단계가 종료되어 안정적이라고 판단될 때까지 실험적(experimental)으로 표시되어 있습니다.

@Canapin 님이 카테고리 설정을 검토해 보시고, 이에 대해 논의해 주실 수 있을 것 같습니다.

잘하고 계시네요, 개발에 행운을 빕니다!

Customization > Plugin 에 "Alpha"와 “Beta” 태그를 추가해야 하지 않을까요? :thinking:

그렇게 하면 새로운 플러그인을 더 쉽게 찾을 수 있고, 설치 시 감수해야 할 위험 수준도 반영할 수 있을 것 같습니다 …

3개의 좋아요

플러그인은 Discourse와 함께 실행되는 코드입니다. 봇은 Admin부터 TL0까지 어떤 권한을 가져도 문제가 되지 않습니다. 왜냐하면 실제로 그것은 단순히 코드 조작의 대상일 뿐이며, 무제한의 권한을 가지고 있기 때문입니다.

사실 저는 이 플러그인의 해당 부분 개발을 이제 완료했습니다. 하지만 플러그인(테마 컴포넌트가 아닌)에 문제가 발생했을 때 더 심각한 결과가 초래될 수 있기 때문에 #customization:plugin에 이 플러그인을 공개하는 것은 신중하게 접근해야 합니다.

저의 포럼에서 플러그인이 출시되고 일정 기간의 검증 기간을 거친 후에 공식적으로 배포할 것입니다.

3개의 좋아요

이 플러그인은 기본적으로 개발 및 테스트가 완료되었습니다. 이제 자신 있게 설치할 수 있습니다!
(다만, 위에 적힌 단계를 따르세요:

5개의 좋아요

@Lhc_fl 정말 유용해 보이는데, 닫힌 주제에서 운영자(OP)가 관리자나 모더레이터처럼 게시물을 올릴 수 있나요? 잠금을 해제하고, 게시물을 올린 뒤 다시 잠그는 것보다 훨씬 나은 흐름이라고 생각합니다.

1개의 좋아요

이 기능을 추가할 계획입니다. 하지만 최근 바빠서 플러그인에 많은 시간을 할애할 수 없습니다. 관심 있는 분은 풀 리퀘스트를 제출해 주세요.

2개의 좋아요

@Lhc_fl
이 플러그인은 정말 좋습니다.

  • 이걸 테마 컴포넌트로 만들 수 있을까요? 더 많은 분들이 이 기능을 사용할 수 있게 될 것 같습니다.
    우리는 인스턴스에 플러그인을 설치할 권한이 없지만, 테마 컴포넌트는 설치할 수 있습니다.

  • 권한 목록에 “주제 분할 및 병합(Split and merge topics)” 항목을 추가할 수 있을까요?

감사합니다…

아니요, 데이터베이스와 상호 작용해야 하므로 불가능합니다.

가능은 하지만 더 어렵습니다. 최근에는 새로운 기능을 추가할 에너지가 없습니다.

3개의 좋아요

ember.js 업그레이드로 인해 이 플러그인이 새로운 버전의 Discourse와 호환되지 않는 점에 대해 죄송합니다. 하지만 지금은 바빠서 수정할 수 없습니다. 수정을 원하시는 분이 계시다면 GitHub에서 PR을 보내 주세요.

3개의 좋아요

오늘 이 플러그인을 업그레이드하여 새로운 버전의 discourse에 맞게 조정했습니다. 이제 플러그인은 더 이상 broken 상태가 아닙니다.

9개의 좋아요

User autonomy plugin enabled을 활성화했지만, 요청을 제출한 후 오류가 발생합니다.

다음은 브라우저 터미널의 로그입니다.


chunk.7b3110aa5b5be8…8f9.d41d8cd9.js:393 
 SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid 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…1d8cd9.js:121:11012)
    at q._end (chunk.7b3110aa5b5be8…1d8cd9.js:121:16062)
    at q.end (chunk.7b3110aa5b5be8…1d8cd9.js:121:13189)
    at q._run (chunk.7b3110aa5b5be8…1d8cd9.js:121:16576)
    at q.run (chunk.7b3110aa5b5be8…1d8cd9.js:121:13722)
    at c (chunk.7b3110aa5b5be8…1d8cd9.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
(匿名)	@	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
(匿名)	@	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
(匿名)	@	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