Skip to content

Commit ead95bf

Browse files
committed
Update actix_web example
1 parent 6eb5440 commit ead95bf

File tree

1 file changed

+27
-37
lines changed

1 file changed

+27
-37
lines changed

examples/echobot_actix_web.rs

+27-37
Original file line numberDiff line numberDiff line change
@@ -4,59 +4,49 @@ use dotenv::dotenv;
44
use std::env;
55

66
use line::bot::LineBot;
7-
use line::events::messages::MessageType as EventMessageType;
7+
use line::events::messages::MessageType;
88
use line::events::{EventType, Events};
99
use line::messages::{SendMessageType, TextMessage};
10+
use line::support::actix_support::Signature;
11+
use line::webhook::validate_signature;
1012

11-
use actix_web::web::Bytes;
12-
use actix_web::{post, App, HttpRequest, HttpResponse, HttpServer, Responder};
13+
use actix_web::{post, web, App, HttpServer, Responder};
1314

1415
#[post("/callback")]
15-
async fn callback(req: HttpRequest, bytes: Bytes) -> impl Responder {
16-
let body: &str = &String::from_utf8(bytes.to_vec()).unwrap();
17-
let signature: &str = req
18-
.headers()
19-
.get("x-line-signature")
20-
.unwrap()
21-
.to_str()
22-
.unwrap();
23-
16+
async fn callback(
17+
signature: Signature,
18+
data: web::Json<Events>,
19+
bytes: web::Bytes,
20+
) -> impl Responder {
2421
// Get channel secret and access token by environment variable
2522
let channel_secret: &str =
26-
&env::var("LINE_CHANNEL_RECRET").expect("Failed getting LINE_CHANNEL_RECRET");
23+
&env::var("LINE_CHANNEL_SECRET").expect("Failed getting LINE_CHANNEL_SECRET");
2724
let access_token: &str =
2825
&env::var("LINE_CHANNEL_ACCESS_TOKEN").expect("Failed getting LINE_CHANNEL_ACCESS_TOKEN");
2926

3027
// LineBot
3128
let bot = LineBot::new(channel_secret, access_token);
3229

33-
// Request body parse
34-
let result: Result<Events, &'static str> = bot.parse_event_request(signature, body);
35-
36-
// Success parsing
37-
if let Ok(res) = result {
38-
for event in res.events {
39-
// MessageEvent only
40-
if let EventType::MessageEvent(message_event) = event.r#type {
41-
// TextMessageEvent only
42-
if let EventMessageType::TextMessage(text_message) = message_event.message.r#type {
43-
// Create TextMessage
44-
let message = SendMessageType::TextMessage(TextMessage {
45-
text: text_message.text,
46-
emojis: None,
47-
});
48-
// Reply message with reply_token
49-
let _res = bot.reply_message(&message_event.reply_token, vec![message]);
50-
}
30+
let body: &str = &String::from_utf8(bytes.to_vec()).unwrap();
31+
validate_signature(&bot.channel_secret, &signature.key, &body);
32+
33+
for event in &data.events {
34+
// MessageEvent only
35+
if let EventType::MessageEvent(message_event) = &event.r#type {
36+
// TextMessageEvent only
37+
if let MessageType::TextMessage(text_message) = &message_event.message.r#type {
38+
// Create TextMessage
39+
let message = SendMessageType::TextMessage(TextMessage {
40+
text: text_message.text.to_string(),
41+
emojis: None,
42+
});
43+
// Reply message with reply_token
44+
let _res = bot.reply_message(&message_event.reply_token, vec![message]);
5145
}
5246
}
53-
return HttpResponse::Ok().body("OK");
54-
}
55-
// Failed parsing
56-
else if let Err(msg) = result {
57-
return HttpResponse::BadRequest().body(msg);
5847
}
59-
HttpResponse::BadRequest().body("Internal Server Error")
48+
49+
"OK"
6050
}
6151

6252
#[actix_rt::main]

0 commit comments

Comments
 (0)