조건과 변수
조건은 흐름을 참과 거짓으로 가르는 조각이에요. 조건 노드에는 나가는 연결점이 두 개 있어요. 참일 때 가는 쪽과 거짓일 때 가는 쪽이에요.
한쪽에는 아무것도 잇지 않아도 돼요. 그러면 그쪽으로 갈 때는 그냥 아무 일도 일어나지 않아요.
[!팁] 급하신가요? 가장 많이 쓰는 건 User Has Role(역할 가졌는지)과 Channel Is(그 채널인지) 둘이에요. 이 둘만 알아도 대부분의 “이럴 때만” 이 만들어져요.
사람과 채널
| 조건 | 참이 되는 때 |
|---|---|
| User Has Role | 사건을 일으킨 사람이 그 역할을 갖고 있을 때 |
| User Has Any Role | 적어 둔 역할 중 하나라도 갖고 있을 때 |
| User In List | 적어 둔 유저 ID 중 하나일 때 |
| Has Permission | 그 사람이 정한 권한을 갖고 있을 때 |
| Is Bot | 사건을 일으킨 쪽이 봇일 때 |
| Channel Is | 사건이 난 채널이 그 채널일 때 |
| Channel In List | 적어 둔 채널 중 하나일 때 |
| Channel In Category | 그 카테고리 안의 채널일 때 |
| Channel Type Is | 채널 종류가 맞을 때 |
| Channel Is NSFW | 채널이 NSFW로 표시돼 있을 때 |
메시지 내용
| 조건 | 참이 되는 때 |
|---|---|
| Message Contains | 정한 글자가 들어 있을 때 |
| Message Starts With · Message Ends With | 그 글자로 시작하거나 끝날 때 |
| Message Length >= · Message Length <= | 길이가 기준을 넘거나 못 미칠 때 |
| Message Has Link | http로 시작하는 주소가 있을 때 |
| Message Has Invite | Discord 초대 링크가 들어 있을 때 |
| Mentions >= | 멘션 수가 기준 이상일 때 |
| Role Mentioned | 그 역할을 멘션했을 때 |
| Has Attachment | 첨부파일이 있을 때 |
| Regex Match | 정규식이 내용과 맞을 때 |
Message Contains 와 Message Starts With 는 대소문자를 다르게 다뤄요. Contains 는 가리지 않고, Starts With 와 Ends With 는 가려요.
[!참고] 정규식은 안전 검사를 통과해야 저장돼요 서버 전체를 멈추게 할 수 있는 모양은 저장 단계에서 거절돼요. 조용히 안 도는 게 아니라 저장 자체가 안 되니, 저장이 막히면 식을 더 단순하게 고쳐 주세요. 그리고 실제로 맞춰 볼 때는 메시지 앞부분 4,000자까지만 봐요.
상태와 시간
| 조건 | 참이 되는 때 |
|---|---|
| Role Added · Role Removed | 이번 변경에서 그 역할이 붙거나 떨어졌을 때 |
| Time Window | 지금 시각이 정한 구간 안일 때 |
| Cooldown | 정한 시간 안에 아직 지나가지 않았을 때 |
| Compare Values | 두 값을 비교해 맞을 때 |
| List Contains | 목록에 그 값이 있을 때 |
Time Window 는 시작 시각과 끝 시각을 시 단위로 적고, 필요하면 시차를 더해요. 시작과 끝을 같게 두면 항상 참이에요. 끝이 시작보다 작으면 자정을 넘는 구간으로 봐요.
Compare Values 는 =, !=, >, <, >=, <=, contains, startswith, endswith 를 골라 쓸 수 있어요. 숫자로 비교를 켜지 않으면 글자끼리 견주므로, 10과 9를 견줄 때는 켜 주세요.
Cooldown 은 서버 단위로 기억해요
Cooldown 조건은 범위를 사용자 · 채널 · 서버 중에 고르고 시간을 초로 적어요. 그 시간 안에 다시 오면 거짓이 돼요.
기억은 서버 저장소에 남아요. 그래서 같은 범위를 쓰는 워크플로가 여럿이면 서로 같은 기록을 봐요. 워크플로마다 따로 세고 싶으면 범위를 나눠 쓰는 편이 안전해요.
값 꺼내 쓰기
입력칸에는 값을 대신 넣을 표시를 쓸 수 있어요. 편집기 오른쪽 변수 패널에서 고르면 알아서 들어가요.
| 표시 | 어디서 오나 |
|---|---|
| {event.…} | 워크플로를 깨운 사건이 들고 온 값이에요 |
| {vars.…} | Set Variable 이나 Text Edit 으로 담아 둔 값이에요 |
| {store.…} | Store 동작으로 저장해 둔 값이에요 |
사건마다 들고 오는 값이 달라요. 메시지 사건은 {event.content}, {event.author_id}, {event.channel_id} 를 주고, 멤버 입장 사건은 {event.user_id}, {event.user_name}, {event.user_display} 를 줘요. 팔레트에서 트리거를 고르면 그 트리거가 주는 값이 변수 패널에 나와요.
없는 이름을 적으면 빈 값으로 바뀌어요. 표시가 그대로 남지 않으니, 결과가 허전하면 이름을 다시 봐 주세요.
오래 남기는 값은 Store 로
Set Variable 과 Text Edit 은 흐름 조각이라 다음 조각으로 이어지지 않아요. 실행 안에서 값을 담아 이어 쓰려면 Store Set 같은 저장 동작을 쓰는 편이 좋아요. 저장 동작은 일반 동작이라 뒤로 계속 이어져요.
저장 이름에는 영문, 숫자, 점, 밑줄, 하이픈만 쓸 수 있어요. 다른 글자는 밑줄로 바뀌고, 128자까지 남아요.
잘 안 되나요?
| 이런가요 | 이렇게 해 보세요 |
|---|---|
| 조건이 늘 거짓이에요 | ID를 넣는 조건은 이름이 아니라 ID를 받아요. Discord에서 ID 복사로 넣어 주세요 |
| 숫자 비교가 이상해요 | Compare Values 의 숫자로 비교를 켜 주세요. 꺼 두면 글자 순서로 견줘요 |
| 조건 뒤에 이어 붙인 동작이 안 돌아요 | 조건에서 나가는 선은 참 쪽과 거짓 쪽 각각 하나씩이에요. 두 개를 이으면 저장할 때 오류가 나요 |
| 정규식을 저장할 수 없어요 | 안전 검사에 걸린 거예요. 반복이 겹치는 모양을 풀어서 더 단순하게 써 주세요 |
| 다른 워크플로 때문에 쿨다운이 걸린 것 같아요 | Cooldown 조건의 기억은 서버 단위예요. 범위를 나눠 주세요 |