Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/StarStatisticsDatabase.cpp
blob: 218bfcf2b7012073eac693ea0717bb4001c10522 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "StarStatisticsDatabase.hpp"
#include "StarJsonExtra.hpp"

namespace Star {

StatisticsDatabase::StatisticsDatabase() : m_cacheMutex(), m_eventCache() {
  auto assets = Root::singleton().assets();

  auto& eventFiles = assets->scanExtension("event");
  assets->queueJsons(eventFiles);
  auto& achievementFiles = assets->scanExtension("achievement");
  assets->queueJsons(achievementFiles);

  for (auto& file : eventFiles) {
    try {
      String name = assets->json(file).getString("eventName");
      if (m_eventPaths.contains(name))
        Logger::error("Event {} defined twice, second time from {}", name, file);
      else
        m_eventPaths[name] = file;
    } catch (std::exception const& e) {
      Logger::error("Error loading event file {}: {}", file, outputException(e, true));
    }
  }

  for (auto& file : achievementFiles) {
    try {
      Json achievement = assets->json(file);
      String name = achievement.getString("name");
      if (m_achievementPaths.contains(name))
        Logger::error("Achievement {} defined twice, second time from {}", name, file);
      else
        m_achievementPaths[name] = file;

      for (Json const& stat : achievement.getArray("triggers", {})) {
        m_statAchievements[stat.toString()].append(name);
      }
    } catch (std::exception const& e) {
      Logger::error("Error loading achievement file {}: {}", file, outputException(e, true));
    }
  }
}

StatEventPtr StatisticsDatabase::event(String const& name) const {
  MutexLocker locker(m_cacheMutex);
  return m_eventCache.get(name, [this](String const& name) -> StatEventPtr {
      if (auto path = m_eventPaths.maybe(name))
        return readEvent(*path);
      return {};
    });
}

AchievementPtr StatisticsDatabase::achievement(String const& name) const {
  MutexLocker locker(m_cacheMutex);
  return m_achievementCache.get(name, [this](String const& name) -> AchievementPtr {
      if (auto path = m_achievementPaths.maybe(name))
        return readAchievement(*path);
      return {};
    });
}

StringList StatisticsDatabase::allAchievements() const {
  return m_achievementPaths.keys();
}

StringList StatisticsDatabase::achievementsForStat(String const& statName) const {
  return m_statAchievements.value(statName);
}

StatEventPtr StatisticsDatabase::readEvent(String const& path) {
  auto assets = Root::singleton().assets();
  Json config = assets->json(path);

  return make_shared<StatEvent>(StatEvent {
      config.getString("eventName"),
      jsonToStringList(config.get("scripts")),
      config
    });
}

AchievementPtr StatisticsDatabase::readAchievement(String const& path) {
  auto assets = Root::singleton().assets();
  Json config = assets->json(path);

  return make_shared<Achievement>(Achievement {
      config.getString("name"),
      jsonToStringList(config.get("triggers")),
      jsonToStringList(config.get("scripts")),
      config
    });
}

}