From ea6fed5ee38da9d63346440273fa7856677cbd3a Mon Sep 17 00:00:00 2001 From: TwoSquirrels Date: Fri, 17 Mar 2023 02:26:45 +0900 Subject: [PATCH 1/2] =?UTF-8?q?chore:=20=F0=9F=A4=96=20add=20line?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 2 +- line/Cargo.toml | 18 ++++++++++++++++++ line/src/main.rs | 0 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 line/Cargo.toml create mode 100644 line/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index 47c8a15..10a4758 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,3 @@ [workspace] -members = ["bot","lib","bench","py","node"] +members = ["bot","line","lib","bench","py","node"] resolver = "2" \ No newline at end of file diff --git a/line/Cargo.toml b/line/Cargo.toml new file mode 100644 index 0000000..2b06fba --- /dev/null +++ b/line/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "artifacter" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0.69" +dotenv = "0.15.0" +enkanetwork-rs = { git = "https://github.com/neodyland/enkanetwork-rs", version = "0.0.3" } +line-bot-sdk-rust = { version = "0.1", features = ["rocket_support"] } +rocket = "0.4" +serde_json = "1.0.94" +tokio = { version = "1.26.0", features = ["full"] } + +[dependencies.gen] +path = "../lib" \ No newline at end of file diff --git a/line/src/main.rs b/line/src/main.rs new file mode 100644 index 0000000..e69de29 From e81af3041cf73e7a70f4c925b07570343780286e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=8A=E3=81=99=E3=82=8A=E3=81=99/TwoSquirrels?= Date: Sat, 18 Mar 2023 16:44:27 +0000 Subject: [PATCH 2/2] WIP --- line/Cargo.toml | 4 +- line/src/main.rs | 112 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 2 deletions(-) diff --git a/line/Cargo.toml b/line/Cargo.toml index 2b06fba..ead1c6e 100644 --- a/line/Cargo.toml +++ b/line/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "artifacter" +name = "artifacter-line" version = "0.1.0" edition = "2021" @@ -8,7 +8,7 @@ edition = "2021" [dependencies] anyhow = "1.0.69" dotenv = "0.15.0" -enkanetwork-rs = { git = "https://github.com/neodyland/enkanetwork-rs", version = "0.0.3" } +enkanetwork-rs = { git = "https://github.com/neodyland/enkanetwork-rs", version = "^0.0.5" } line-bot-sdk-rust = { version = "0.1", features = ["rocket_support"] } rocket = "0.4" serde_json = "1.0.94" diff --git a/line/src/main.rs b/line/src/main.rs index e69de29..df8ca24 100644 --- a/line/src/main.rs +++ b/line/src/main.rs @@ -0,0 +1,112 @@ +use std::{collections::HashMap, env, sync::Arc}; + +extern crate line_bot_sdk_rust as line; +#[macro_use] +extern crate rocket; + +use crate::util::{create_components, json, Locale}; +use enkanetwork_rs::{EnkaNetwork, IconData}; +use gen::{ImageFormat, Lang, ScoreCounter}; +use line::bot::LineBot; +use line::events::messages::MessageType as EventMessageType; +use line::events::{EventType, Events}; +use line::messages::{SendMessageType, TextMessage}; +use line::support::rocket_support::{Body, Signature}; +use rocket::State; +use rocket::http::Status; +use serde_json::Value; +use tokio::sync::Mutex; + +struct Environment { + pub line_channel_secret: str, + pub line_access_token: str, +} +//mod util; +struct Data { + pub api: EnkaNetwork, + pub icons: IconData, + pub cache: HashMap, + pub looping: bool, +} +type Error = Box; + +fn get_score_calc(s: &ScoreCounter) -> Value { + match s { + ScoreCounter::Normal => { + json!({"ja": "会心率 × 2 + 会心ダメージ + 攻撃力(%)", "en": "Critical Rate × 2 + Critical Damage + Attack(%)"}) + } + ScoreCounter::Hp => { + json!({"ja": "会心率 × 2 + 会心ダメージ + HP(%)", "en": "Critical Rate × 2 + Critical Damage + HP(%)"}) + } + ScoreCounter::Def => { + json!({"ja": "会心率 × 2 + 会心ダメージ + 防御(%)", "en": "Critical Rate × 2 + Critical Damage + Defense(%)"}) + } + ScoreCounter::ElementalMastery => { + json!({"ja": "会心率 × 2 + 会心ダメージ + (熟知 ÷ 4)", "en": "Critical Rate × 2 + Critical Damage + (Elemental Mastery ÷ 4)"}) + } + ScoreCounter::ChargeEfficiency => { + json!({"ja": "会心率 × 2 + 会心ダメージ + 元素チャージ効率", "en": "Critical Rate × 2 + Critical Damage + Elemental Charge Efficiency"}) + } + } +} + +#[post("/", data = "")] +fn callback(signature: Signature, body: Body, environment: State, data: State) -> Status { + let bot = LineBot::new(&environment.line_channel_secret, &environment.line_access_token); + let result: Result = + bot.parse_event_request(&signature.key, &body.string); + + match result { + Ok(res) => { + for event in res.events { + if let EventType::MessageEvent(message_event) = event.r#type { + // TextMessageEvent only + if let EventMessageType::TextMessage(text_message) = message_event.message.r#type { + // Create TextMessage + let message = SendMessageType::TextMessage(TextMessage { + text: text_message.text, + emojis: None, + }); + // Reply message with reply_token + let _res = bot.reply_message(&message_event.reply_token, vec![message]); + } + } + } + return Status::new(200, "OK"); + }, + Err(msg) => { + return Status::new(500, msg); + }, + } +} + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + dotenv::dotenv().ok(); + + let line_channel_secret = + env::var("LINE_CHANNEL_SECRET").expect("Failed getting LINE_CHANNEL_SECRET"); + let line_access_token = + env::var("LINE_CHANNEL_ACCESS_TOKEN").expect("Failed getting LINE_CHANNEL_ACCESS_TOKEN"); + let environment = Environment { + line_channel_secret, + line_access_token, + }; + + let api = EnkaNetwork::new()?; + let icons = IconData::load(&api).await; + let data = Data { + api, + icons, + cache: HashMap::new(), + looping: false, + }; + + rocket::ignite() + .mount("/", routes![callback]) + .manage(environment) + .manage(data) + .launch(); + + Ok(()) +}