forked from asklyphe-public/asklyphe
Compare commits
10 commits
c39a425d48
...
4f6063bf72
| Author | SHA1 | Date | |
|---|---|---|---|
| 4f6063bf72 | |||
| b7b466b774 | |||
| 25644b9d4e | |||
| 849393fbd1 | |||
| c2f210c32c | |||
| 7a57c7bf1e | |||
| fe539a637e | |||
| f11aa99038 | |||
| 0725850ad0 | |||
| de1d9931b1 |
10 changed files with 493 additions and 6 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
http://127.0.0.1:8001 {
|
http://127.0.0.1:1235 {
|
||||||
route /static/* {
|
route /static/* {
|
||||||
uri strip_prefix /static
|
uri strip_prefix /static
|
||||||
file_server {
|
file_server {
|
||||||
|
|
@ -6,10 +6,10 @@ http://127.0.0.1:8001 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reverse_proxy 127.0.0.1:5843
|
reverse_proxy http://auth-frontend:5843
|
||||||
}
|
}
|
||||||
|
|
||||||
http://127.0.0.1:8002 {
|
http://127.0.0.1:1234 {
|
||||||
route /static/* {
|
route /static/* {
|
||||||
uri strip_prefix /static
|
uri strip_prefix /static
|
||||||
file_server {
|
file_server {
|
||||||
|
|
@ -17,5 +17,5 @@ http://127.0.0.1:8002 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reverse_proxy 127.0.0.1:5842
|
reverse_proxy http://frontend:5842
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ pub mod searchbot;
|
||||||
pub mod wikipedia;
|
pub mod wikipedia;
|
||||||
pub mod unit_converter;
|
pub mod unit_converter;
|
||||||
pub mod bangs;
|
pub mod bangs;
|
||||||
|
pub mod math;
|
||||||
pub mod routes;
|
pub mod routes;
|
||||||
|
|
||||||
use std::{env, process};
|
use std::{env, process};
|
||||||
|
|
|
||||||
346
asklyphe-frontend/src/math.rs
Normal file
346
asklyphe-frontend/src/math.rs
Normal file
|
|
@ -0,0 +1,346 @@
|
||||||
|
use tracing::{debug, error};
|
||||||
|
use once_cell::sync::Lazy;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Calculation {
|
||||||
|
pub equation: String,
|
||||||
|
pub result: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn calculate(query: &str) -> Option<Calculation> {
|
||||||
|
debug!("Got query {}", query);
|
||||||
|
let mut parser = Parser::new(Lexer::new(query));
|
||||||
|
let tree = parser.parse()?;
|
||||||
|
let res = tree.eval();
|
||||||
|
|
||||||
|
debug!("Calculation: {}", query);
|
||||||
|
debug!("Tree: {:?}", tree);
|
||||||
|
debug!("Result: {}", res);
|
||||||
|
Some(Calculation {equation: query.to_string(), result: res.to_string()})
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: put into own crate with dependency astro-float = "0.9.2" so I can use more than f64
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
enum Token {
|
||||||
|
Op(Op),
|
||||||
|
Atom(Atom),
|
||||||
|
/* Number(f64),
|
||||||
|
Func(Func),*/
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
enum Op {
|
||||||
|
BinOp(BinOp),
|
||||||
|
Func(Func), // A function is an Op that takes whatever the next thing is and binds it, either the next number or whatever is in parens
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Op {
|
||||||
|
fn get_lbp(&self) -> f64 {
|
||||||
|
match self {
|
||||||
|
Op::BinOp(op) => match op {
|
||||||
|
BinOp::LParen => 0.0,
|
||||||
|
BinOp::RParen => 0.0,
|
||||||
|
BinOp::Add => 1.0,
|
||||||
|
BinOp::Subtract => 1.0,
|
||||||
|
BinOp::Multiply => 2.0,
|
||||||
|
BinOp::Divide => 2.0,
|
||||||
|
BinOp::Exponent => 3.0,
|
||||||
|
},
|
||||||
|
Op::Func(_) => 0.0, // TODO: decide if this is a good LBP
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_rbp(&self) -> f64 {
|
||||||
|
match self {
|
||||||
|
Op::BinOp(op) => match op {
|
||||||
|
BinOp::LParen => 0.0,
|
||||||
|
BinOp::RParen => 0.0,
|
||||||
|
BinOp::Add => 1.1,
|
||||||
|
BinOp::Subtract => 1.1,
|
||||||
|
BinOp::Multiply => 2.1,
|
||||||
|
BinOp::Divide => 2.1,
|
||||||
|
BinOp::Exponent => 3.1,
|
||||||
|
},
|
||||||
|
Op::Func(_) => 4.0, // TODO: decide if this is a good RBP
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fn apply_to(&self, args: &Vec<Expr>) -> f64 {
|
||||||
|
match (self) {
|
||||||
|
Op::BinOp(op) => match op {
|
||||||
|
BinOp::LParen => args[0].eval(),
|
||||||
|
BinOp::RParen => args[0].eval(),
|
||||||
|
BinOp::Add => args[0].eval() + args[1].eval(),
|
||||||
|
BinOp::Subtract => args[0].eval() - args[1].eval(),
|
||||||
|
BinOp::Multiply => args[0].eval() * args[1].eval(),
|
||||||
|
BinOp::Divide => args[0].eval() / args[1].eval(),
|
||||||
|
BinOp::Exponent => args[0].eval().powf(args[1].eval()),
|
||||||
|
},
|
||||||
|
Op::Func(f) => match f {
|
||||||
|
Func::Sine => args[0].eval().sin(),
|
||||||
|
Func::ArcSine => args[0].eval().asin(),
|
||||||
|
Func::SquareRoot => args[0].eval().sqrt(),
|
||||||
|
_ => todo!("{:?}", f),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
enum BinOp {
|
||||||
|
Add,
|
||||||
|
Subtract,
|
||||||
|
Multiply,
|
||||||
|
Divide,
|
||||||
|
Exponent,
|
||||||
|
LParen,
|
||||||
|
RParen,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
enum Atom {
|
||||||
|
Number(f64), // TODO: use the high precision floats library instead
|
||||||
|
Const(Const),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Atom {
|
||||||
|
fn get_val(&self) -> f64 {
|
||||||
|
match self {
|
||||||
|
Atom::Number(val) => *val,
|
||||||
|
Atom::Const(c) => match c {
|
||||||
|
Const::Pi => 3.141592653589793238462643383279,
|
||||||
|
Const::E => 2.718281828459045235360287471352,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
enum Func {
|
||||||
|
Sine,
|
||||||
|
Cosine,
|
||||||
|
Tangent,
|
||||||
|
// sin-1, cos-1, tan-1
|
||||||
|
ArcSine,
|
||||||
|
ArcCosine,
|
||||||
|
ArcTangent,
|
||||||
|
Log2,
|
||||||
|
Log10,
|
||||||
|
LogN,
|
||||||
|
Square,
|
||||||
|
SquareRoot,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
enum Const {
|
||||||
|
Pi,
|
||||||
|
E,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
enum ParseErr {
|
||||||
|
Eof,
|
||||||
|
Invalid,
|
||||||
|
}
|
||||||
|
|
||||||
|
// this can probably be swapped out with a lexer generator like Logos if needed
|
||||||
|
|
||||||
|
struct Lexer<'a> {
|
||||||
|
data: &'a str,
|
||||||
|
data_ptr: &'a str,
|
||||||
|
idx: usize,
|
||||||
|
next_tok: Result<Token, ParseErr>,
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: refactor with iterator that returns Option(Token) where one token option is Eof (or a enum of Token(Token) and Eof, or just Option(Option(Token)))
|
||||||
|
impl Lexer<'_> {
|
||||||
|
|
||||||
|
fn new(data: &str) -> Lexer<'_> {
|
||||||
|
let mut n: Lexer = Lexer {data, data_ptr: data, idx: 0, next_tok: Err(ParseErr::Eof)};
|
||||||
|
n.next();
|
||||||
|
debug!("New finished!");
|
||||||
|
n
|
||||||
|
}
|
||||||
|
|
||||||
|
fn _next(&mut self) -> Result<Token, ParseErr> {
|
||||||
|
match self.data.chars().nth(self.idx) {
|
||||||
|
Some(val) => {
|
||||||
|
debug!("lexing char '{}' at idx {}", val, self.idx);
|
||||||
|
// debug!("current char '{}'", self.data.chars().nth(0).unwrap());
|
||||||
|
self.idx += 1;
|
||||||
|
// TODO: make more efficient
|
||||||
|
self.data_ptr = &self.data[self.idx..];
|
||||||
|
match val {
|
||||||
|
'+' => Ok(Token::Op(Op::BinOp(BinOp::Add))),
|
||||||
|
'-' => Ok(Token::Op(Op::BinOp(BinOp::Subtract))),
|
||||||
|
'×' | '*' => Ok(Token::Op(Op::BinOp(BinOp::Multiply))),
|
||||||
|
'÷' | '/' => Ok(Token::Op(Op::BinOp(BinOp::Divide))),
|
||||||
|
'^' => Ok(Token::Op(Op::BinOp(BinOp::Exponent))),
|
||||||
|
'(' => Ok(Token::Op(Op::BinOp(BinOp::LParen))),
|
||||||
|
')' => Ok(Token::Op(Op::BinOp(BinOp::RParen))),
|
||||||
|
_ if val.is_whitespace() => self._next(),
|
||||||
|
// TODO: maybe parse '-' as part of number so I can do '1 + -1' and similar
|
||||||
|
_ if val.is_digit(10) => {
|
||||||
|
let start = self.idx - 1;
|
||||||
|
|
||||||
|
self.data_ptr.chars().take_while(|c| c.is_digit(10)).for_each(|_| self.idx += 1);//.next().unwrap_or(' ').is_digit(10) {self.idx += 1;}
|
||||||
|
|
||||||
|
match self.data[start..self.idx].parse() {
|
||||||
|
Ok(val) => Ok(Token::Atom(Atom::Number(val))),
|
||||||
|
Err(e) => Err(ParseErr::Invalid),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
let mut l: usize;
|
||||||
|
l = matches(&self.data[self.idx - 1..], "sin");
|
||||||
|
if l != 0 {
|
||||||
|
self.idx += l;
|
||||||
|
return Ok(Token::Op(Op::Func(Func::Sine)));
|
||||||
|
}
|
||||||
|
l = matches(&self.data[self.idx - 1..], "cos");
|
||||||
|
if l != 0 {
|
||||||
|
self.idx += l;
|
||||||
|
return Ok(Token::Op(Op::Func(Func::Cosine)));
|
||||||
|
}
|
||||||
|
l = matches(&self.data[self.idx - 1..], "tan");
|
||||||
|
if l != 0 {
|
||||||
|
self.idx += l;
|
||||||
|
return Ok(Token::Op(Op::Func(Func::Tangent)));
|
||||||
|
}
|
||||||
|
l = matches(&self.data[self.idx - 1..], "arcsin");
|
||||||
|
if l != 0 {
|
||||||
|
self.idx += l;
|
||||||
|
return Ok(Token::Op(Op::Func(Func::ArcSine)));
|
||||||
|
}
|
||||||
|
l = matches(&self.data[self.idx - 1..], "arccos");
|
||||||
|
if l != 0 {
|
||||||
|
self.idx += l;
|
||||||
|
return Ok(Token::Op(Op::Func(Func::ArcCosine)));
|
||||||
|
}
|
||||||
|
l = matches(&self.data[self.idx - 1..], "arctan");
|
||||||
|
if l != 0 {
|
||||||
|
self.idx += l;
|
||||||
|
return Ok(Token::Op(Op::Func(Func::ArcTangent)));
|
||||||
|
}
|
||||||
|
l = matches(&self.data[self.idx - 1..], "sqrt");
|
||||||
|
if l != 0 {
|
||||||
|
self.idx += l;
|
||||||
|
return Ok(Token::Op(Op::Func(Func::SquareRoot)));
|
||||||
|
}
|
||||||
|
|
||||||
|
debug!("got invalid char '{}'", val);
|
||||||
|
Err(ParseErr::Invalid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => Err(ParseErr::Eof),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn next(&mut self) -> Result<Token, ParseErr> {
|
||||||
|
let val = self.next_tok;
|
||||||
|
self.next_tok = self._next();
|
||||||
|
val
|
||||||
|
}
|
||||||
|
|
||||||
|
fn peek(&mut self) -> Result<Token, ParseErr> {
|
||||||
|
self.next_tok
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: replace with iterator so I can do parser.parse(lexer.iter()) and parse does lex_iter.next() & such
|
||||||
|
fn lex_all(&mut self) -> Option<Vec<Token>> {
|
||||||
|
let mut tokens: Vec<Token> = vec![];
|
||||||
|
loop {
|
||||||
|
match self.next() {
|
||||||
|
Err(ParseErr::Eof) => return Some(tokens),
|
||||||
|
Err(ParseErr::Invalid) => return None,
|
||||||
|
Ok(tok) => tokens.push(tok),
|
||||||
|
}
|
||||||
|
// debug!("tokens: {:?}", tokens);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn matches(s: &str, check: &str) -> usize {
|
||||||
|
// debug!("s: \"{}\", check: \"{}\"c_len: {}, s_len: {}, s[c_len]: {:?}, s[c_len + 1]: {:?}", s, check, check.chars().count(), s.chars().count(), s.chars().nth(check.chars().count()), s.chars().nth(check.chars().count() + 1));
|
||||||
|
match (s.chars().count(), check.chars().count()) {
|
||||||
|
(s_len, c_len) if s_len < c_len => 0,
|
||||||
|
(s_len, c_len) if s_len == c_len && s == check => c_len - 1,
|
||||||
|
(s_len, c_len) if s_len > c_len && s.starts_with(check) && s.chars().nth(c_len).unwrap().is_whitespace() => c_len,
|
||||||
|
(_, _) => 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Parser<'a> {
|
||||||
|
lex: Lexer<'a>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Parser<'_> {
|
||||||
|
fn new(lex: Lexer) -> Parser { Parser {lex} }
|
||||||
|
|
||||||
|
fn parse(&mut self) -> Option<Expr> {
|
||||||
|
self.parse_expr(0.0).ok()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_expr(&mut self, min_bp: f64) -> Result<Expr, ParseErr> {
|
||||||
|
/*while let Ok(val) = self.lex.next() {debug!("token: {:?}", val)}
|
||||||
|
match self.lex.next().err() {
|
||||||
|
|
||||||
|
_ => return Err(ParseErr::Invalid),
|
||||||
|
}*/
|
||||||
|
let mut lhs: Expr = match self.lex.next() {
|
||||||
|
Ok(val) => match val {
|
||||||
|
Token::Atom(val) => Ok(Expr::Atom(val)),
|
||||||
|
Token::Op(op) => match op {
|
||||||
|
Op::BinOp(BinOp::LParen) => self.parse_expr(op.get_lbp()),
|
||||||
|
Op::Func(f) => Ok(Expr::Node(Op::Func(f), vec![self.parse_expr(op.get_lbp())?])),
|
||||||
|
_ => Err(ParseErr::Invalid),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Err(err) => Err(err),
|
||||||
|
}.map_err(|err| { debug!("Unexpected error at start of expr: {:?}", err); err })?;
|
||||||
|
debug!("lhs of expression is {:?}", lhs);
|
||||||
|
loop {
|
||||||
|
let op: Op = match self.lex.peek() {
|
||||||
|
Err(ParseErr::Eof) => break,
|
||||||
|
Err(e) => { debug!("In expr got err {:?}", e); Err(e) },
|
||||||
|
Ok(tok) => match tok {
|
||||||
|
Token::Op(op) => match op {
|
||||||
|
Op::BinOp(op) => match op {
|
||||||
|
BinOp::RParen => break,
|
||||||
|
_ => Ok(Op::BinOp(op)),
|
||||||
|
},
|
||||||
|
Op::Func(f) => {
|
||||||
|
lhs = Expr::Node(Op::Func(f), vec![self.parse_expr(Op::Func(f).get_lbp())?]);
|
||||||
|
continue;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
v => { debug!("Got unexpected token {:?}", v); Err(ParseErr::Invalid) },
|
||||||
|
}
|
||||||
|
}.map_err(|err| { debug!("Unexpected error inside expr at {:?}", err); err })?;
|
||||||
|
if (op.get_lbp() < min_bp) { break; }
|
||||||
|
self.lex.next();
|
||||||
|
let rhs: Expr = self.parse_expr(op.get_rbp())?;
|
||||||
|
lhs = Expr::Node(op, vec![lhs, rhs]);
|
||||||
|
}
|
||||||
|
Ok(lhs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum Expr {
|
||||||
|
Atom(Atom),
|
||||||
|
Node(Op, Vec<Expr>),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Expr {
|
||||||
|
fn eval(&self) -> f64 {
|
||||||
|
let res = match (self) {
|
||||||
|
Expr::Atom(at) => at.get_val(),
|
||||||
|
Expr::Node(op, exprs) => op.apply_to(exprs),
|
||||||
|
};
|
||||||
|
// debug!("{:?} evaluated to {}", self, res);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -19,6 +19,8 @@ use crate::unit_converter::UnitConversion;
|
||||||
use crate::wikipedia::WikipediaSummary;
|
use crate::wikipedia::WikipediaSummary;
|
||||||
use crate::{wikipedia, Opts, ALPHA, BUILT_ON, GIT_COMMIT, VERSION, YEAR};
|
use crate::{wikipedia, Opts, ALPHA, BUILT_ON, GIT_COMMIT, VERSION, YEAR};
|
||||||
use crate::bangs;
|
use crate::bangs;
|
||||||
|
use crate::math;
|
||||||
|
use crate::math::Calculation;
|
||||||
use askama::Template;
|
use askama::Template;
|
||||||
use asklyphe_common::nats;
|
use asklyphe_common::nats;
|
||||||
use asklyphe_common::nats::bingservice::{
|
use asklyphe_common::nats::bingservice::{
|
||||||
|
|
@ -69,6 +71,7 @@ pub struct Complications {
|
||||||
disabled: bool,
|
disabled: bool,
|
||||||
wikipedia: Option<WikipediaSummary>,
|
wikipedia: Option<WikipediaSummary>,
|
||||||
unit_converter: Option<UnitConversion>,
|
unit_converter: Option<UnitConversion>,
|
||||||
|
math: Option<Calculation>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn search(
|
pub async fn search(
|
||||||
|
|
@ -176,6 +179,11 @@ pub async fn search_js(
|
||||||
if let Some(redirect) = bang_redirect {
|
if let Some(redirect) = bang_redirect {
|
||||||
return Redirect::to(&redirect).into_response();
|
return Redirect::to(&redirect).into_response();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut calc_query = query.clone().to_lowercase();
|
||||||
|
calc_query = calc_query.replace("calculate", "").replace("what is", "");
|
||||||
|
let math = math::calculate(&calc_query);
|
||||||
|
complications.math = math;
|
||||||
} else {
|
} else {
|
||||||
complications.disabled = true;
|
complications.disabled = true;
|
||||||
query = query.replace("-complications", "");
|
query = query.replace("-complications", "");
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,13 @@
|
||||||
</div>
|
</div>
|
||||||
{% when None %}
|
{% when None %}
|
||||||
{% endmatch %}
|
{% endmatch %}
|
||||||
|
{% match complications.math %}
|
||||||
|
{% when Some with (math) %}
|
||||||
|
<div class="calculator-complication">
|
||||||
|
<h1>{{ math.equation }} = {{ math.result }}</h1>
|
||||||
|
</div>
|
||||||
|
{% when None %}
|
||||||
|
{% endmatch %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endmatch %}
|
{% endmatch %}
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ impl FromStr for Proxy {
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
let mut parts = s.split(':');
|
let mut parts = s.split(':');
|
||||||
|
let protocol = parts.next().ok_or(ProxyError::InvalidProxyFormat)?;
|
||||||
let host = parts.next().ok_or(ProxyError::InvalidProxyFormat)?;
|
let host = parts.next().ok_or(ProxyError::InvalidProxyFormat)?;
|
||||||
let port = parts.next().ok_or(ProxyError::InvalidProxyFormat)?;
|
let port = parts.next().ok_or(ProxyError::InvalidProxyFormat)?;
|
||||||
let auth = if let Some(user) = parts.next() {
|
let auth = if let Some(user) = parts.next() {
|
||||||
|
|
@ -39,8 +40,8 @@ impl FromStr for Proxy {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
Ok(Proxy {
|
Ok(Proxy {
|
||||||
address: format!("{}:{}", host, port),
|
address: format!("{}://{}:{}", protocol, host, port),
|
||||||
credentials: auth,
|
credentials: auth,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
34
cert.pem
Normal file
34
cert.pem
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIF7zCCA9egAwIBAgIUb46GxLSqbrjV/nlD+ovwlYcyzOcwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwgYYxCzAJBgNVBAYTAlhYMRIwEAYDVQQIDAlTdGF0ZU5hbWUxETAPBgNVBAcM
|
||||||
|
CENpdHlOYW1lMRQwEgYDVQQKDAtDb21wYW55TmFtZTEbMBkGA1UECwwSQ29tcGFu
|
||||||
|
eVNlY3Rpb25OYW1lMR0wGwYDVQQDDBRDb21tb25OYW1lT3JIb3N0bmFtZTAeFw0y
|
||||||
|
NTA2MjEwNTA1NTlaFw0zNTA2MTkwNTA1NTlaMIGGMQswCQYDVQQGEwJYWDESMBAG
|
||||||
|
A1UECAwJU3RhdGVOYW1lMREwDwYDVQQHDAhDaXR5TmFtZTEUMBIGA1UECgwLQ29t
|
||||||
|
cGFueU5hbWUxGzAZBgNVBAsMEkNvbXBhbnlTZWN0aW9uTmFtZTEdMBsGA1UEAwwU
|
||||||
|
Q29tbW9uTmFtZU9ySG9zdG5hbWUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
|
||||||
|
AoICAQC28URbBWcTpvOar679u4CwsAHQ+i+9iPBvjRG/ShdvXkAgWm+t/BvKi9JG
|
||||||
|
FOAn49IKOpcteY15qvDFRPDKk8YWoiwdMQSKRNEwEow3YlIs6xX94+PNdwsjaqy/
|
||||||
|
mhJTMh0xrElZJ5+B4mDXQHOzdS6fe0SlNhqEAkFaIuUNX1NAks7yRnkC5LGkSHHj
|
||||||
|
gD2ZThwyZ+cstvT7WEUN9uMz/FfLuQQLrVZDydE9tsoQo0CIl1l0NLiE0BN5RIwi
|
||||||
|
i6Gkao74jlxh6tXv7XcOTxZ1aV3F92qMKN1NtWFEqpC2PDdfLG5iAlwamKguD24N
|
||||||
|
RMDC9CGCiutE4lRhRQWkC89NSxOkG25MGRvK0jut7MiKOia/Xk5uJI2Rid9IWFKv
|
||||||
|
xnuT5AW9PCbjM0OSkw2G0PzthUAO1jrOyA2R50oh/YGsdslELhlpZSiu/StSx+0U
|
||||||
|
x0E9dcQHvnlllU5BrYXbDkoSCiejhD4xV35KmhIwtz7pr2cajfeJ5r7Em/hSBVbS
|
||||||
|
Zqbv5OmGgxTSSDLUTaLJA015vLnLNCV5al/iGzXKl1FOwTIzRLv+og/jK70rwOGX
|
||||||
|
Red2JnKntqfBEnR51gky9axyyz3dAMEE1rCc+oOv7ycZoEKwPdXiyneOCLT40QT6
|
||||||
|
No1UrMJCa32a4+YJgbANB8igFwwhdapD5N+qvpCWtiKsdnbPeQIDAQABo1MwUTAd
|
||||||
|
BgNVHQ4EFgQUq3zHWtMlNawKBIPiOECsuPWTB7IwHwYDVR0jBBgwFoAUq3zHWtMl
|
||||||
|
NawKBIPiOECsuPWTB7IwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
|
||||||
|
AgEAtoERmowTDvnZFV4ETGmj3mPXNLXaqSUDRAB5ol9N4NlRU/vFjI70sYV7uco9
|
||||||
|
628Wc5SLbA66wSmpnq5t1MeTjjra6o6bj5wOKixo1gmpUq7Ru1JmVWsNIo/Zv4ew
|
||||||
|
rmCxuapHL0U9R0P1qpJe0tYzSMFikgkFmHyL86HcuW8B/Ps3bGaGlamqmIK3HlP4
|
||||||
|
Ib+sOtInNZ1Td8eYTIYO5Nk5ko/4rjZrv9+3aZdjde1z/M2VduGGH8TCExD55Rbv
|
||||||
|
+UL8fGIEkfSNTeiA5SAN3dfqcra703mfOJfjJeoubfk8KowfGb/bVKv8Z8rkEDOj
|
||||||
|
so+sOgbq1xnSaQov7WRqYZ0yKZA0u8Arc0L8CX/rwgwoBkQafySEI/32Mqt0R4/w
|
||||||
|
MkmGZLSFTcIFrQVE+wBHTilQ1PfUmAA6kh7ks7SGwlc6KxTAtYZHWklCqib0efaJ
|
||||||
|
AbODBc97vLrR5qoH0VFSGLnjDVEYHb6TREqsCZR+9EP/JcsTRJ8RTeDVg8RnN2a6
|
||||||
|
uy01L7A3d1xnXPux45fpwgGTOEig2sD0BTHZW/bl53xQr8gJvwyr78cIVmycT/6N
|
||||||
|
K0AmYBPQWZLf6rxtommjMgf2DtvhPm6VrbHV7epk8cw8tOVRPD5uLjZzKxgFoZez
|
||||||
|
ZYNjSUse3ChC7l4FhjmTiI5DWOrS/qYbWYi9rzvG6QZwHss=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
@ -105,6 +105,19 @@ services:
|
||||||
ports:
|
ports:
|
||||||
- "1234:80"
|
- "1234:80"
|
||||||
- "1235:81"
|
- "1235:81"
|
||||||
|
# caddy:
|
||||||
|
# image: caddy:latest
|
||||||
|
# networks:
|
||||||
|
# - lyphenet
|
||||||
|
# - outer
|
||||||
|
# depends_on:
|
||||||
|
# - frontend
|
||||||
|
# - auth-frontend
|
||||||
|
# volumes:
|
||||||
|
# - ./Caddyfile:/etc/caddy/Caddyfile
|
||||||
|
# ports:
|
||||||
|
# - 1234:1234
|
||||||
|
# - 1235:1235
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
outer:
|
outer:
|
||||||
|
|
|
||||||
52
key.pem
Normal file
52
key.pem
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
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
|
||||||
|
hfHYKzHGaDbp/aPWH8HQzfs6QxGRog==
|
||||||
|
-----END PRIVATE KEY-----
|
||||||
25
shell.nix
Executable file
25
shell.nix
Executable file
|
|
@ -0,0 +1,25 @@
|
||||||
|
{ pkgs ? import <nixpkgs> {}, lib ? pkgs.lib }:
|
||||||
|
pkgs.mkShellNoCC {
|
||||||
|
packages = with pkgs; [ rustup nats-server caddy postgresql clang pkg-config tmux /*you'll *need* tmux*/ ];
|
||||||
|
buildInputs = with pkgs; [ openssl clang foundationdb ];
|
||||||
|
LIBCLANG_PATH = lib.makeLibraryPath [ pkgs.libclang ];
|
||||||
|
shellHook = ''
|
||||||
|
rustup install stable
|
||||||
|
rustup default stable
|
||||||
|
export RUST_LOG=debug
|
||||||
|
export NATS_URL="127.0.0.1:4222"
|
||||||
|
export NATS_CERT=$(cat cert.pem)
|
||||||
|
export NATS_KEY=$(cat key.pem)
|
||||||
|
export ASKLYPHE_URL="http://127.0.0.1:8002"
|
||||||
|
export AUTH_URL="http://127.0.0.1:8001"
|
||||||
|
export DB_URL="postgres://127.0.0.1:5432/user"
|
||||||
|
export SMTP_DISABLE=1
|
||||||
|
export SMTP_USERNAME=""
|
||||||
|
export SMTP_PASSWORD=""
|
||||||
|
export SMTP_URL=""
|
||||||
|
export POSTGRESQL_PASSWORD="user"
|
||||||
|
# lmao
|
||||||
|
echo WARNING: RUSTFLAGS="-A dead_code -A unused"
|
||||||
|
export RUSTFLAGS="-A dead_code -A unused"
|
||||||
|
'';
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue