@lucifer-m
golang php js html css

Как элегантно реализовать задания на сайте?

Добрый день. Мне необходимо реализовать миссии (к примеру помиловать двух игроков) я бы мог написать инструкцию проверки прямо в функции помилования но тогда прийдётся очень туго с добавлением новых миссий и редактированием старых (по всему коду же разбросаны). Я хочу это всё сделать в одном месте. На ум пришла 1 бредовая идея: все обработчики отправлять колбеком в функцию обработчик миссий
  • Вопрос задан
  • 370 просмотров
Решения вопроса 2
bitver
@bitver
Как вариант.
Если пользуетесь каким-то фреймворком, то возможно там есть система ивентов, если нет, то пишите свою. Далее, каждое успешное действие запускает триггер своего глобального евента. А всю логику уже можно обрабатывать в отдельном компоненте, подписавшись на нужные вам ивенты.
Сразу скажу, будет проблема с передачей аргументов, особенно нужен будет контекст, но фреймворки обычно решают этим проблемы.
Ответ написан
@lucifer-m Автор вопроса
golang php js html css
package events

import (
	"sync"
)

var Event map[string]func(ps []string)

func init() {
	Event = make(map[string]func(ps []string))
}

// Подписка на событие
func Add(name string, callback func(ps []string)) {
	rw := &sync.RWMutex{}
	rw.Lock()
	defer rw.Unlock()

	Event[name] = callback

}

// Вызов события
func Call(name string, ps []string) {
	rw := &sync.RWMutex{}
	rw.RLock()
	defer rw.RUnlock()
	go Event[name](ps)

}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@mantyr
Пишу много Golang кода с удовольствием:)
https://play.golang.org/p/NJ-X38UrWC

В дополнение к комментарию на другой ответ.
package events

import (
  "sync"
)

var events *Events

type Events struct {
    sync.RWMutex
    list map[string]func(ps []string)
}

func NewEventsList() (list *Events) {
    list = new(Events)
    list.list = make(map[string]func(ps []string))
    return list
}

func init() {
  events = NewEventsList()
}

func Add(name string, callback func(ps []string)) {
    events.Add(name, callback)
}

func Call(name string, ps []string) bool {
    return events.Call(name, ps)
}


// Подписка на событие
func (l *Events) Add(name string, callback func(ps []string)) {
    l.Lock()
    defer l.Unlock()
    l.list[name] = callback
}

// Вызов события
func (l *Events) Call(name string, ps []string) bool {
    l.RLock()
    defer l.RUnlock()
    if f, ok := l.list[name]; ok {
        go f(ps)
        return true
    }
    return false
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы