aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Perry <avaglir@gmail.com>2019-03-08 18:10:59 -0500
committerNathan Perry <avaglir@gmail.com>2019-03-08 18:10:59 -0500
commit108db50a7374a785f309e049b287e9b47532f566 (patch)
treed25be7765dcf79e259fd431a0bf3bc0979da0ce1
parent86025df1f6d814c98a14211ceb4da6cf6de915c7 (diff)
working version
-rw-r--r--Cargo.lock70
-rw-r--r--Cargo.toml3
-rw-r--r--migrations/2019-03-08-073831_store-token/down.sql2
-rw-r--r--migrations/2019-03-08-073831_store-token/up.sql10
-rw-r--r--src/game.rs327
-rw-r--r--src/main.rs3
6 files changed, 96 insertions, 319 deletions
diff --git a/Cargo.lock b/Cargo.lock
index fc0b444..ff96643 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -307,35 +307,6 @@ dependencies = [
]
[[package]]
-name = "curl"
-version = "0.4.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "curl-sys 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)",
- "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)",
- "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)",
- "schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
- "socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "curl-sys"
-version = "0.4.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)",
- "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
- "openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)",
- "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
- "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
name = "diesel"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -753,17 +724,6 @@ dependencies = [
]
[[package]]
-name = "libz-sys"
-version = "1.0.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)",
- "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
- "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
name = "lock_api"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1011,19 +971,6 @@ dependencies = [
]
[[package]]
-name = "oauth2"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "curl 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)",
- "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
- "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
name = "openssl"
version = "0.10.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1652,17 +1599,6 @@ version = "0.6.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
-name = "socket2"
-version = "0.3.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)",
- "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
name = "sodiumoxide"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1831,7 +1767,6 @@ dependencies = [
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"nom 4.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "oauth2 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"reqwest 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2226,8 +2161,6 @@ dependencies = [
"checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b"
"checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c"
"checksum ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "630391922b1b893692c6334369ff528dcc3a9d8061ccf4c803aa8f83cb13db5e"
-"checksum curl 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "c7c9d851c825e0c033979d4516c9173bc19a78a96eb4d6ae51d4045440eafa16"
-"checksum curl-sys 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ca79238a79fb294be6173b4057c95b22a718c94c4e38475d5faa82b8383f3502"
"checksum diesel 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a2469cbcf1dfb9446e491cac4c493c2554133f87f7d041e892ac82e5cd36e863"
"checksum diesel_derives 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "62a27666098617d52c487a41f70de23d44a1dc1f3aa5877ceba2790fb1f1cab4"
"checksum dotenv 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0d0a1279c96732bc6800ce6337b6a614697b0e74ae058dc03c62ebeb78b4d86"
@@ -2274,7 +2207,6 @@ dependencies = [
"checksum libflate 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "54d1ddf9c52870243c5689d7638d888331c1116aa5b398f3ba1acfa7d8758ca1"
"checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2"
"checksum libsodium-sys 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01839d6a151535905648d69dbbbf9c3f8f104b7890469508d504f4cd48d64643"
-"checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe"
"checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c"
"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6"
@@ -2302,7 +2234,6 @@ dependencies = [
"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1"
"checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba"
-"checksum oauth2 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18c3c3e438a0e6cbbbfc72969a5ba24e8cae74c244642ef97b0bfab2823b2860"
"checksum openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)" = "84321fb9004c3bce5611188a644d6171f895fa2889d155927d528782edb21c5d"
"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de"
"checksum openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)" = "cb534d752bf98cf363b473950659ac2546517f9c6be9723771614ab3f03bbc9e"
@@ -2375,7 +2306,6 @@ dependencies = [
"checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac"
"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
"checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be"
-"checksum socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d11a52082057d87cb5caa31ad812f4504b97ab44732cd8359df2e9ff9f48e7"
"checksum sodiumoxide 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71c0682b4406fa25d621b19d2e70b5f6c8627e39b4b7ce0e24b2ef05d0fbe1ca"
"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8"
"checksum statrs 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "10102ac8d55e35db2b3fafc26f81ba8647da2e15879ab686a67e6d19af2685e8"
diff --git a/Cargo.toml b/Cargo.toml
index a102eaa..d7f2c1d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,7 +5,7 @@ authors = ["Nathan Perry <avaglir@gmail.com>"]
[features]
default = ["diesel", "games"]
-games = ["oauth2"]
+games = []
[dependencies]
lazy_static = "~1.3"
@@ -32,7 +32,6 @@ timeago = "^0.1"
nom = { version = "~4.2", features = ["verbose-errors"] }
statrs = "^0.10"
fnv = "~1.0"
-oauth2 = { version = "~1.3", optional = true }
[dependencies.serenity]
default-features = false
diff --git a/migrations/2019-03-08-073831_store-token/down.sql b/migrations/2019-03-08-073831_store-token/down.sql
deleted file mode 100644
index c2bacf0..0000000
--- a/migrations/2019-03-08-073831_store-token/down.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-DROP INDEX oauth_token_exp_index;
-DROP TABLE google_oauth_tokens;
diff --git a/migrations/2019-03-08-073831_store-token/up.sql b/migrations/2019-03-08-073831_store-token/up.sql
deleted file mode 100644
index 94f826b..0000000
--- a/migrations/2019-03-08-073831_store-token/up.sql
+++ /dev/null
@@ -1,10 +0,0 @@
-CREATE TABLE google_oauth_tokens (
- id SERIAL PRIMARY KEY,
- token VARCHAR NOT NULL,
- refresh_token VARCHAR NOT NULL,
- expiration TIMESTAMP NOT NULL,
- created TIMESTAMP NOT NULL DEFAULT current_timestamp
-);
-
-CREATE INDEX oauth_token_exp_index ON google_oauth_tokens (expiration);
-CREATE INDEX oauth_token_created_index ON google_oauth_tokens (created);
diff --git a/src/game.rs b/src/game.rs
index 200ef42..4fd7eca 100644
--- a/src/game.rs
+++ b/src/game.rs
@@ -1,5 +1,5 @@
use failure::err_msg;
-use oauth2::Config;
+use fnv::FnvHashMap;
use serenity::{
framework::standard::{
Args,
@@ -20,34 +20,11 @@ use crate::{
};
lazy_static! {
- static ref SHEETS_CLIENT_ID: String = must_env_lookup("SHEETS_CLIENT_ID");
- static ref SHEETS_SECRET: String = must_env_lookup("SHEETS_CLIENT_SECRET");
+ static ref SHEETS_API_KEY: String = must_env_lookup("SHEETS_API_KEY");
static ref SPREADSHEET_ID: String = must_env_lookup("SPREADSHEET_ID");
}
-#[cfg(debug_assertions)] const REDIRECT_URL: &'static str = "http://localhost:8080";
-#[cfg(not(debug_assertions))] const REDIRECT_URL: &'static str = "https://somali-derp.com/thulani_redirect";
-
pub fn register(s: StandardFramework) -> StandardFramework {
- use std::{
- thread,
- time::Duration,
- };
-
- thread::spawn(|| {
- thread::sleep(Duration::from_secs(10));
-
- loop {
- debug!("starting token maintenance");
- if let Err(e) = maintain_token() {
- error!("maintaining google access token: {}", e);
- }
- debug!("token maintenance complete");
-
- thread::sleep(Duration::from_secs(60 * 2));
- }
- });
-
s.command("game", |c| c
.known_as("gaem")
.desc("what game should we play?")
@@ -55,9 +32,32 @@ pub fn register(s: StandardFramework) -> StandardFramework {
)
}
-fn game(_ctx: &mut Context, msg: &Message, _args: Args) -> Result<()> {
- use std::collections::HashSet;
- use fnv::FnvHashMap;
+lazy_static! {
+ static ref USER_MAP: FnvHashMap<UserId, String> = {
+ use serde_json::Value;
+ use std::str;
+ let map_bytes = include_bytes!("../user_id_mapping.json");
+
+ let v: Value = serde_json::from_str(str::from_utf8(&map_bytes[..]).unwrap()).unwrap();
+ match v {
+ Value::Object(m) => {
+ m.iter()
+ .map(|(k, v)| match v {
+ Value::Number(n) => (UserId(n.as_u64().unwrap()), k.clone()),
+ _ => panic!("non-number in user id mapping"),
+ })
+ .collect()
+ },
+ _ => panic!("couldn't read user id mapping"),
+ }
+ };
+}
+
+fn game(_ctx: &mut Context, msg: &Message, mut args: Args) -> Result<()> {
+ use fnv::{
+ FnvHashMap,
+ FnvHashSet,
+ };
let guild = msg.channel_id.to_channel()?
.guild()
@@ -79,39 +79,20 @@ fn game(_ctx: &mut Context, msg: &Message, _args: Args) -> Result<()> {
.collect::<FnvHashMap<_, _>>();
let channel = pairs.get(&msg.author.id).unwrap_or(&*VOICE_CHANNEL_ID);
- let mut users = HashSet::new();
- pairs.iter().for_each(|(uid, cid)| {
- if cid == channel {
- users.insert(*uid);
- }
- });
-
-// if users.len() < 2 {
-// info!("too few users in voice chat to make game comparison");
-// send(msg.channel_id, "yer too lonely", msg.tts)?;
-// return Ok(());
-// }
-
- lazy_static! {
- static ref USER_MAP: FnvHashMap<UserId, String> = {
- use serde_json::Value;
- use std::str;
- let map_bytes = include_bytes!("../user_id_mapping.json");
+ let users = pairs
+ .iter()
+ .filter_map(|(uid, cid)| {
+ if cid == channel {
+ USER_MAP.get(uid).map(|s| s.to_lowercase())
+ } else { None }
+ })
+ .collect::<FnvHashSet<_>>();
- let v: Value = serde_json::from_str(str::from_utf8(&map_bytes[..]).unwrap()).unwrap();
- match v {
- Value::Object(m) => {
- m.iter()
- .map(|(k, v)| match v {
- Value::Number(n) => (UserId(n.as_u64().unwrap()), k.clone()),
- _ => panic!("non-number in user id mapping"),
- })
- .collect()
- },
- _ => panic!("couldn't read user id mapping"),
- }
- };
+ if users.len() < 2 {
+ info!("too few known users in voice chat to make game comparison");
+ send(msg.channel_id, "yer too lonely", msg.tts)?;
+ return Ok(());
}
use url::Url;
@@ -121,13 +102,11 @@ fn game(_ctx: &mut Context, msg: &Message, _args: Args) -> Result<()> {
u.query_pairs_mut()
.append_pair("ranges", "a1:p")
- .append_pair("valueRenderOption", "UNFORMATTED_VALUE")
- .append_pair("majorDimension", "COLUMNS");
-
- let oauth_token = get_oauth_token()?;
+ .append_pair("valueRenderOption", "FORMATTED_VALUE")
+ .append_pair("majorDimension", "COLUMNS")
+ .append_pair("key", &*SHEETS_API_KEY);
- let mut req = reqwest::Request::new(reqwest::Method::GET, u);
- req.headers_mut().insert("Authorization", reqwest::header::HeaderValue::from_str(&format!("Bearer {}", oauth_token))?);
+ let req = reqwest::Request::new(reqwest::Method::GET, u);
let client = reqwest::Client::new();
@@ -136,7 +115,7 @@ fn game(_ctx: &mut Context, msg: &Message, _args: Args) -> Result<()> {
#[derive(Deserialize)]
struct Resp {
#[serde(rename = "valueRanges")]
- value_ranges: Inner,
+ value_ranges: Vec<Inner>,
}
#[derive(Deserialize)]
@@ -144,187 +123,69 @@ fn game(_ctx: &mut Context, msg: &Message, _args: Args) -> Result<()> {
values: Vec<Vec<String>>,
}
- let data = resp.json::<Resp>()?.value_ranges.values;
-
- use itertools::Itertools;
- info!("data: {}", data.iter().map(|row| row.iter().join(" ")).join("\n"));
-
- Ok(())
-}
-
-lazy_static! {
- static ref CONFIG: Config = Config::new(
- SHEETS_CLIENT_ID.as_ref(),
- SHEETS_SECRET.as_ref(),
- "https://accounts.google.com/o/oauth2/v2/auth",
- "https://www.googleapis.com/oauth2/v4/token",
- )
- .add_scope("https://www.googleapis.com/auth/spreadsheets.readonly")
- .set_redirect_url(REDIRECT_URL);
-}
-
-fn get_oauth_token() -> Result<String> {
- use std::{
- net::TcpListener,
- };
-
- use url::Url;
- use chrono;
-
- use diesel::{
- NotFound,
- result::Error as DieselError,
- };
-
- use crate::db;
-
-
- lazy_static! {
- static ref AUTH_URL: Url = {
- let mut u = CONFIG.authorize_url();
- u.query_pairs_mut()
- .append_pair("access_type", "offline");
-
- u
- };
- }
-
- #[cfg(debug_assertions)]
- const PORT: u16 = 8080;
-
- #[cfg(not(debug_assertions))]
- const PORT: u16 = 8981;
+ let data = &resp.json::<Resp>()?.value_ranges[0].values;
- let conn = db::connection()?;
+ let user_indexes = (0..data.len())
+ .filter_map(|i| {
+ let user = data[i][0].to_lowercase();
- let token = db::GoogleOAuthToken::latest(&conn);
+ if users.contains(&user) {
+ Some((user, i))
+ } else { None }
+ })
+ .collect::<FnvHashMap<_, _>>();
- match token {
- Ok(t) => return Ok(t.token),
- Err(e) => {
- if let Some(NotFound) = e.downcast_ref::<DieselError>() {
- info!("no token found in database");
- } else {
- return Err(e);
- }
- }
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+ enum GameStatus {
+ Installed,
+ NotInstalled,
+ NotOwned,
+ Unknown,
}
- eprintln!("please navigate to {} in your browser", AUTH_URL.as_str());
-
- let listener = TcpListener::bind(&format!("127.0.0.1:{}", PORT))?;
-
- const ATTEMPTS: usize = 10;
- let code = listener.incoming()
- .filter_map(|s| s.ok())
- .map(|mut stream| {
- use std::io::{
- BufReader,
- BufRead,
- Write,
- };
-
- let mut request_line = String::new();
-
- {
- let mut reader = BufReader::new(&stream);
- reader.read_line(&mut request_line).ok()?;
- }
-
- let url =
- Url::parse(&format!("http://localhost{}", request_line.split_whitespace().nth(1)?)).ok()?;
+ let user_games = user_indexes
+ .iter()
+ .map(|(user, col)| {
+ let empty_hash_set: FnvHashSet<_> = vec![].into_iter().collect();
- let code = url.query_pairs()
- .find(|(key, _)| key == "code")
- .map(|(_, code)| code.into_owned());
+ let mut game_map = vec! [
+ (GameStatus::Installed, empty_hash_set.clone()),
+ (GameStatus::NotInstalled, empty_hash_set.clone()),
+ (GameStatus::NotOwned, empty_hash_set.clone()),
+ (GameStatus::Unknown, empty_hash_set),
+ ]
+ .into_iter()
+ .collect::<FnvHashMap<_, _>>();
- let message = "all set";
- let resp = format!(
- "HTTP/1.1 20 OK\r\ncontent-length: {}\r\n\r\n{}",
- message.len(),
- message,
- );
+ (1..data[*col].len())
+ .for_each(|i| {
+ let status = &data[*col][i];
- stream.write_all(resp.as_bytes()).ok()?;
+ let game = &data[0][i];
+ if status.starts_with("y") {
+ game_map.get_mut(&GameStatus::Installed).unwrap().insert(game);
+ } else if status.starts_with("n/i") {
+ game_map.get_mut(&GameStatus::NotInstalled).unwrap().insert(game);
+ } else if status.starts_with("n") {
+ game_map.get_mut(&GameStatus::NotOwned).unwrap().insert(game);
+ } else {
+ game_map.get_mut(&GameStatus::Unknown).unwrap().insert(game);
+ }
+ });
- code
+ (user, game_map)
})
- .take(ATTEMPTS)
- .find(|x| !x.is_none());
-
- let code = match code {
- None => return Err(err_msg(format!("couldn't acquire oauth code from google after {} attempts", ATTEMPTS))),
- Some(c) => c.unwrap(),
- };
+ .collect::<FnvHashMap<_, _>>();
- let token = CONFIG.exchange_code(code)?;
+ let mut games_in_common = user_games.values().nth(0).unwrap()[&GameStatus::Installed].clone();
- if token.expires_in.is_none() || token.refresh_token.is_none() {
- return Err(err_msg("token expiration or refresh token was missing"));
+ for (_user, game_map) in user_games.iter() {
+ games_in_common = games_in_common.intersection(&game_map[&GameStatus::Installed]).cloned().collect();
}
- let now = chrono::Utc::now().naive_utc();
- let new_expiration = token.expires_in
- .map(|exp_sec| now + chrono::Duration::seconds(exp_sec.into()))
- .unwrap();
-
- let result = db::GoogleOAuthToken::create(&conn, token.access_token, token.refresh_token.unwrap(), new_expiration)?;
+ use itertools::Itertools;
+ let games_formatted = games_in_common.iter().join("\n");
- Ok(result.token)
+ send(msg.channel_id, &format!("games in common:\n{}", games_formatted), msg.tts)
}
-fn maintain_token() -> Result<()> {
- use diesel::{
- Connection,
- result::Error as DieselError,
- NotFound,
- };
-
- use chrono;
-
- use crate::db;
-
- let conn = db::connection()?;
-
- conn.transaction(|| {
- let latest_token = db::GoogleOAuthToken::latest(&conn);
- let latest_token = match latest_token {
- Ok(t) => t,
- Err(e) => {
- if let Some(NotFound) = e.downcast_ref::<DieselError>() {
- info!("maintaining google auth: no token to refresh found in database");
- return Ok(());
- }
-
- return Err(e);
- }
- };
-
- let now = chrono::Utc::now().naive_utc();
- let diff = latest_token.expiration - now;
-
- if diff > chrono::Duration::minutes(10) {
- info!("token has {} minutes remaining: not refreshing", diff.num_minutes());
- return Ok(());
- }
-
- let new_token = CONFIG.exchange_refresh_token(latest_token.refresh_token)?;
-
- if new_token.refresh_token.is_none() || new_token.expires_in.is_none() {
- return Err(err_msg("refreshed token missing refresh token or expiration"));
- }
-
- info!("received new token from google");
-
- let new_expiration = new_token.expires_in
- .map(|exp_sec| now + chrono::Duration::seconds(exp_sec.into()))
- .unwrap();
-
- db::GoogleOAuthToken::create(&conn,
- new_token.access_token,
- new_token.refresh_token.unwrap(),
- new_expiration)?;
-
- Ok(())
- })
-}
diff --git a/src/main.rs b/src/main.rs
index 598b94f..1577c89 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -2,6 +2,7 @@
#![feature(try_trait)]
#![feature(pattern)]
#![feature(concat_idents)]
+#![feature(associated_type_defaults)]
#![feature(box_syntax, box_patterns)]
@@ -18,8 +19,6 @@ extern crate fnv;
#[macro_use] extern crate lazy_static;
#[macro_use] extern crate log;
#[macro_use] extern crate nom;
-#[cfg(feature = "games")]
-extern crate oauth2;
extern crate rand;
extern crate regex;
extern crate reqwest;