mirror of
https://github.com/ultrasn0w/huso.git
synced 2025-12-13 23:09:52 +01:00
114 lines
2.6 KiB
Go
114 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
_ "embed"
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
//go:embed mm.cred
|
|
var mmDbCred string
|
|
|
|
func GetMmConnString() (string, error) {
|
|
pw, err := base64.StdEncoding.DecodeString(mmDbCred)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return fmt.Sprintf("%s:%s@tcp(%s)/moviemanager?parseTime=true", *mmDbUser, pw, *mmDbServer), err
|
|
}
|
|
|
|
func MmReadOracle() ([]MmOracle, error) {
|
|
key := "oracle"
|
|
var oracles []MmOracle
|
|
data, err := mmCache.Get(key)
|
|
if err == nil {
|
|
err = json.Unmarshal(data, &oracles)
|
|
if err == nil {
|
|
return oracles, err
|
|
}
|
|
}
|
|
|
|
oracleQuery := `SELECT m.id, m.title, m.mal_id, COALESCE(SUM(pv.score), 0) AS avgScore FROM movie m
|
|
JOIN vote pv ON (m.id = pv.movie_id)
|
|
JOIN promise pp ON (pp.user_id = pv.user_id)
|
|
JOIN evening me ON (pp.evening_id = me.id)
|
|
WHERE m.id NOT IN (
|
|
SELECT m2.id FROM movie m2
|
|
JOIN evening_movie em2 ON (m2.id = em2.movie_id)
|
|
JOIN evening e2 ON (em2.evening_id = e2.id)
|
|
WHERE e2.date < CURDATE()
|
|
) AND (
|
|
m.id IN (
|
|
SELECT mm.movie_source FROM movie m3
|
|
JOIN movie_movie mm ON (m3.id = mm.movie_target)
|
|
JOIN evening_movie em3 ON (mm.movie_target = em3.movie_id)
|
|
JOIN evening e3 ON (em3.evening_id = e3.id)
|
|
WHERE e3.date < CURDATE() GROUP BY m3.id
|
|
)
|
|
OR
|
|
m.id NOT IN (
|
|
SELECT mm.movie_source FROM movie m4
|
|
JOIN movie_movie mm ON (m4.id = mm.movie_source)
|
|
)
|
|
)
|
|
AND pp.promised = 1 AND m.aired = 1 AND me.date >= CURDATE() AND me.date < DATE_ADD(CURDATE(), INTERVAL 1 WEEK) GROUP BY m.id ORDER BY avgScore DESC, m.id ASC;`
|
|
rows, err := mmDb.Query(oracleQuery)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
oracles = make([]MmOracle, 0)
|
|
for rows.Next() {
|
|
var oracle MmOracle
|
|
var qMalId sql.NullInt64
|
|
err = rows.Scan(&oracle.Id, &oracle.Title, &qMalId, &oracle.AvgScore)
|
|
if err != nil {
|
|
return oracles, err
|
|
}
|
|
if qMalId.Valid {
|
|
oracle.Anime = qMalId.Int64
|
|
}
|
|
oracles = append(oracles, oracle)
|
|
}
|
|
|
|
err = rows.Err()
|
|
|
|
if err == nil {
|
|
bytes, err := json.Marshal(oracles)
|
|
if err == nil {
|
|
mmCache.Set(key, bytes)
|
|
}
|
|
}
|
|
|
|
return oracles, err
|
|
}
|
|
|
|
func MmReadCharts() ([]MmOracle, error) {
|
|
chartsQuery := `SELECT m.id, m.title, m.mal_id FROM movie m
|
|
JOIN evening_movie em ON em.movie_id = m.id
|
|
JOIN evening e ON em.evening_id = e.id
|
|
WHERE e.date <= CURDATE() AND m.mal_id IS NOT NULL;`
|
|
rows, err := mmDb.Query(chartsQuery)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
charts := make([]MmOracle, 0)
|
|
for rows.Next() {
|
|
var chart MmOracle
|
|
err = rows.Scan(&chart.Id, &chart.Title, &chart.Anime)
|
|
if err != nil {
|
|
return charts, err
|
|
}
|
|
charts = append(charts, chart)
|
|
}
|
|
|
|
err = rows.Err()
|
|
|
|
return charts, err
|
|
}
|