@@ -2,9 +2,8 @@ use std::thread;
2
2
use std:: time:: Duration ;
3
3
4
4
use :: actix:: prelude:: * ;
5
- use :: serenity:: {
6
- model:: prelude:: * ,
7
- } ;
5
+ use serenity:: model:: prelude:: * ;
6
+ use serenity:: http;
8
7
9
8
use crate :: Error ;
10
9
@@ -39,19 +38,38 @@ impl Handler<SendMessage> for DiscordWorker {
39
38
type Result = Result < ( ) , Error > ;
40
39
41
40
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 ) )
48
66
}
49
- _ => {
50
- return Err ( From :: from ( e) ) ;
67
+ // 모르는 유형의 에러일경우 즉시 포기
68
+ Err ( e) => {
69
+ return Err ( From :: from ( e) )
51
70
}
52
71
}
53
72
}
54
- Ok ( ( ) )
55
73
}
56
74
}
57
75
0 commit comments