bf851bd9fc
Added support for dyntmpl to the template system. The Account Dashboard now sort of uses dyntmpl, more work needed here. Renamed the pre_render_view_topic hook to pre_render_topic. Added the GetCurrentLangPack() function. Added the alerts_no_new_alerts phrase. Added the account_level_list phrase. Refactored the route rename logic in the patcher to cut down on the amount of boilerplate. Added more route renames to the patcher. You will need to run the patcher / updater in this commit.
130 lines
3.1 KiB
Go
130 lines
3.1 KiB
Go
/*
|
|
*
|
|
* Gosora Task System
|
|
* Copyright Azareal 2017 - 2018
|
|
*
|
|
*/
|
|
package common
|
|
|
|
import (
|
|
"database/sql"
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/Azareal/Gosora/query_gen"
|
|
)
|
|
|
|
type TaskStmts struct {
|
|
getExpiredScheduledGroups *sql.Stmt
|
|
getSync *sql.Stmt
|
|
}
|
|
|
|
var ScheduledHalfSecondTasks []func() error
|
|
var ScheduledSecondTasks []func() error
|
|
var ScheduledFifteenMinuteTasks []func() error
|
|
var ScheduledHourTasks []func() error
|
|
var ShutdownTasks []func() error
|
|
var taskStmts TaskStmts
|
|
var lastSync time.Time
|
|
|
|
// TODO: Add a TaskInits.Add
|
|
func init() {
|
|
lastSync = time.Now()
|
|
DbInits.Add(func(acc *qgen.Accumulator) error {
|
|
taskStmts = TaskStmts{
|
|
getExpiredScheduledGroups: acc.Select("users_groups_scheduler").Columns("uid").Where("UTC_TIMESTAMP() > revert_at AND temporary = 1").Prepare(),
|
|
getSync: acc.Select("sync").Columns("last_update").Prepare(),
|
|
}
|
|
return acc.FirstError()
|
|
})
|
|
}
|
|
|
|
// AddScheduledHalfSecondTask is not concurrency safe
|
|
func AddScheduledHalfSecondTask(task func() error) {
|
|
ScheduledHalfSecondTasks = append(ScheduledHalfSecondTasks, task)
|
|
}
|
|
|
|
// AddScheduledSecondTask is not concurrency safe
|
|
func AddScheduledSecondTask(task func() error) {
|
|
ScheduledSecondTasks = append(ScheduledSecondTasks, task)
|
|
}
|
|
|
|
// AddScheduledFifteenMinuteTask is not concurrency safe
|
|
func AddScheduledFifteenMinuteTask(task func() error) {
|
|
ScheduledFifteenMinuteTasks = append(ScheduledFifteenMinuteTasks, task)
|
|
}
|
|
|
|
// AddScheduledHourTask is not concurrency safe
|
|
func AddScheduledHourTask(task func() error) {
|
|
ScheduledHourTasks = append(ScheduledHourTasks, task)
|
|
}
|
|
|
|
// AddShutdownTask is not concurrency safe
|
|
func AddShutdownTask(task func() error) {
|
|
ShutdownTasks = append(ShutdownTasks, task)
|
|
}
|
|
|
|
// TODO: Use AddScheduledSecondTask
|
|
func HandleExpiredScheduledGroups() error {
|
|
rows, err := taskStmts.getExpiredScheduledGroups.Query()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var uid int
|
|
for rows.Next() {
|
|
err := rows.Scan(&uid)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Sneaky way of initialising a *User, please use the methods on the UserStore instead
|
|
user := BlankUser()
|
|
user.ID = uid
|
|
err = user.RevertGroupUpdate()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return rows.Err()
|
|
}
|
|
|
|
// TODO: Use AddScheduledSecondTask
|
|
// TODO: Be a little more granular with the synchronisation
|
|
// TODO: Synchronise more things
|
|
// TODO: Does this even work?
|
|
func HandleServerSync() error {
|
|
// We don't want to run any unnecessary queries when there is nothing to synchronise
|
|
/*if Config.ServerCount > 1 {
|
|
return nil
|
|
}*/
|
|
|
|
var lastUpdate time.Time
|
|
err := taskStmts.getSync.QueryRow().Scan(&lastUpdate)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if lastUpdate.After(lastSync) {
|
|
err = Forums.LoadForums()
|
|
if err != nil {
|
|
log.Print("Unable to reload the forums")
|
|
return err
|
|
}
|
|
// TODO: Resync the groups
|
|
// TODO: Resync the permissions
|
|
err = LoadSettings()
|
|
if err != nil {
|
|
log.Print("Unable to reload the settings")
|
|
return err
|
|
}
|
|
err = WordFilters.ReloadAll()
|
|
if err != nil {
|
|
log.Print("Unable to reload the word filters")
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|