This repository has been archived on 2022-06-29. You can view files and clone it, but cannot push or open issues or pull requests.
urtrator/timer/timer.go
Stanislav N. aka pztrn 070aa50762 Little profile refactoring and favorite server adding fix.
Done some refactoring on profiles handling. Too small, but deserve
these two lines in commit.

Fixed favorite server addition from scratch.
2017-05-13 01:08:56 +05:00

131 lines
3.1 KiB
Go

// URTator - Urban Terror server browser and game launcher, written in
// Go.
//
// Copyright (c) 2016, Stanslav N. a.k.a pztrn (or p0z1tr0n)
// All rights reserved.
//
// Licensed under Terms and Conditions of GNU General Public License
// version 3 or any higher.
// ToDo: put full text of license here.
package timer
import (
// stdlib
"errors"
"fmt"
"strconv"
"sync"
"time"
)
type Timer struct {
// Tasks.
tasks map[string]*TimerTask
// Tasks map mutex.
tasksMutex sync.Mutex
}
func (t *Timer) AddTask(task *TimerTask) error {
fmt.Println("Adding task '" + task.Name + "'...")
_, ok := t.tasks[task.Name]
if ok {
error_text := "Task '" + task.Name + "' already exist! Ignoring..."
fmt.Println(error_text)
return errors.New(error_text)
}
task.InProgress = false
curtime := time.Now()
nextlaunch := curtime.Add(time.Duration(task.Timeout) * time.Second)
task.NextLaunch = nextlaunch
t.tasksMutex.Lock()
t.tasks[task.Name] = task
t.tasksMutex.Unlock()
fmt.Println("Added task '" + task.Name + "' with " + strconv.Itoa(task.Timeout) + " seconds timeout")
return nil
}
func (t *Timer) executeTasks() {
t.tasksMutex.Lock()
for task_name, task := range t.tasks {
// Check if task should be run.
curtime := time.Now()
diff := curtime.Sub(task.NextLaunch)
//fmt.Println(diff)
if diff > 0 {
fmt.Println("Checking task '" + task_name + "'...")
// Check if task is already running.
if task.InProgress {
fmt.Println("Already executing, skipping...")
continue
}
fmt.Println("Launching task '" + task_name + "'...")
task.InProgress = true
Eventer.LaunchEvent(task.Callee, map[string]string{})
curtime = time.Now()
nextlaunch := curtime.Add(time.Duration(task.Timeout) * time.Second)
task.NextLaunch = nextlaunch
}
}
t.tasksMutex.Unlock()
}
func (t *Timer) GetTaskStatus(task_name string) bool {
t.tasksMutex.Lock()
task, ok := t.tasks[task_name]
t.tasksMutex.Unlock()
if !ok {
return false
}
return task.InProgress
}
func (t *Timer) Initialize() {
fmt.Println("Initializing timer...")
t.initializeStorage()
Eventer.AddEventHandler("taskDone", t.SetTaskNotInProgress)
ticker := time.NewTicker(time.Second * 1)
go func() {
for _ = range ticker.C {
go t.executeTasks()
}
}()
}
func (t *Timer) initializeStorage() {
t.tasks = make(map[string]*TimerTask)
}
func (t *Timer) RemoveTask(task_name string) {
t.tasksMutex.Lock()
_, ok := t.tasks[task_name]
t.tasksMutex.Unlock()
if !ok {
return
}
t.tasksMutex.Lock()
delete(t.tasks, task_name)
t.tasksMutex.Unlock()
}
func (t *Timer) SetTaskNotInProgress(data map[string]string) {
t.tasksMutex.Lock()
_, ok := t.tasks[data["task_name"]]
if !ok {
return
}
t.tasks[data["task_name"]].InProgress = false
t.tasksMutex.Unlock()
}