Skip to content

Commit 48ddbee

Browse files
committed
Choose between Webhook and bot API depending on 'SendMessage'
1 parent 3425a7b commit 48ddbee

File tree

1 file changed

+30
-12
lines changed

1 file changed

+30
-12
lines changed

src/discord_client/worker.rs

+30-12
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ use std::thread;
22
use std::time::Duration;
33

44
use ::actix::prelude::*;
5-
use ::serenity::{
6-
model::prelude::*,
7-
};
5+
use serenity::model::prelude::*;
6+
use serenity::http;
87

98
use crate::Error;
109

@@ -39,19 +38,38 @@ impl Handler<SendMessage> for DiscordWorker {
3938
type Result = Result<(), Error>;
4039

4140
fn handle(&mut self, msg: SendMessage, _: &mut Self::Context) -> Self::Result {
42-
let SendMessage { channel, content, .. } = msg;
43-
while let Err(e) = channel.send_message(|msg| msg.content(content.clone())) {
44-
use serenity::Error::*;
45-
match e {
46-
Http(..) | Hyper(..) | WebSocket(..) => {
47-
thread::sleep(Duration::from_millis(100));
41+
use serenity::Error::{Http, Hyper, WebSocket};
42+
43+
// TODO: 설정을 어딘가 괜찮은곳에 저장해야함
44+
let id = 245037420704169985;
45+
let token = "ig5AO-wdVWpCBtUUMxmgsWryqgsW3DChbKYOINftJ4DCrUbnkedoYZD0VOH1QLr-S3sV";
46+
let webhook = http::get_webhook_with_token(id, token).expect("valid webhook");
47+
48+
loop {
49+
// 메세지 전송
50+
let result = if let Some(nick) = &msg.nickname {
51+
// 닉네임이 있음; Webhook을 사용해 전송함
52+
webhook.execute(true, |w| w.content(&msg.content).username(&nick)).map(|_| ())
53+
} else {
54+
// 닉네임이 없음; Bot API를 사용해 전송함
55+
msg.channel.send_message(|m| m.content(&msg.content)).map(|_| ())
56+
};
57+
58+
match result {
59+
// 성공할경우 결과 반환
60+
Ok(()) => {
61+
return Ok(())
62+
}
63+
// 다음 에러중 하나일경우 일정시간 대기 후 재시도
64+
Err(Http(_)) | Err(Hyper(_)) | Err(WebSocket(_)) => {
65+
thread::sleep(Duration::from_millis(100))
4866
}
49-
_ => {
50-
return Err(From::from(e));
67+
// 모르는 유형의 에러일경우 즉시 포기
68+
Err(e) => {
69+
return Err(From::from(e))
5170
}
5271
}
5372
}
54-
Ok(())
5573
}
5674
}
5775

0 commit comments

Comments
 (0)