1 /*
2 * This file is part of GtkEveMon.
3 *
4 * GtkEveMon is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * You should have received a copy of the GNU General Public License
10 * along with GtkEveMon. If not, see <http://www.gnu.org/licenses/>.
11 */
12
13 #ifndef CHARACTER_HEADER
14 #define CHARACTER_HEADER
15
16 #include <string>
17 #include <sigc++/signal.h>
18
19 #include "util/ref_ptr.h"
20 #include "api/eveapi.h"
21 #include "api/apicharsheet.h"
22 #include "api/apiskillqueue.h"
23
24 /* TODO
25 * Move caching to this class? This enables to read API errors
26 */
27
28 class Character;
29 typedef ref_ptr<Character> CharacterPtr;
30
31 class Character
32 {
33 public:
34 typedef sigc::signal<void, EveApiDocType, std::string> SignalRequestError;
35 typedef sigc::signal<void, EveApiDocType, std::string> SignalCachedWarning;
36 typedef sigc::signal<void, std::string> SignalNameAvailable;
37 typedef sigc::signal<void> SignalApiInfoChanged;
38 typedef sigc::signal<void> SignalCharSheetUpdated;
39 typedef sigc::signal<void> SignalSkillQueueUpdated;
40 typedef sigc::signal<void> SignalSkillCompleted;
41 typedef sigc::signal<void> SignalTrainingChanged;
42
43 protected:
44 EveApiAuth auth;
45 EveApiFetcher cs_fetcher;
46 EveApiFetcher sq_fetcher;
47
48 SignalRequestError sig_request_error;
49 SignalCachedWarning sig_cached_warning;
50 SignalNameAvailable sig_name_available;
51 SignalApiInfoChanged sig_api_info_changed;
52 SignalCharSheetUpdated sig_char_sheet_updated;
53 SignalSkillQueueUpdated sig_skill_queue_updated;
54 SignalSkillCompleted sig_skill_completed;
55 SignalTrainingChanged sig_training_changed;
56
57 public:
58 /* API sheets. The sheets do not contain any live information. */
59 ApiCharSheetPtr cs;
60 ApiSkillQueuePtr sq;
61
62 /* Information if the charsheet is available. */
63 unsigned int char_base_sp;
64 unsigned int char_live_sp; /* Live SP. */
65
66 /* Information if the training sheet is available. */
67 ApiSkill const* training_skill;
68 ApiSkillQueueItem training_info;
69 unsigned int training_spph;
70 unsigned int training_level_sp; /* Live SP. */
71 unsigned int training_skill_sp; /* Live SP. */
72 double training_level_done; /* Live SP. */
73 time_t training_remaining; /* Live SP. */
74
75 /* Information if both, charsheet AND training are available. */
76 ApiCharSheetSkill* training_cskill;
77 unsigned int char_group_base_sp;
78 unsigned int char_group_live_sp; /* Live SP. */
79
80 protected:
81 Character (EveApiAuth const& auth);
82
83 void on_cs_available (EveApiData data);
84 void on_sq_available (EveApiData data);
85
86 void process_api_data (void);
87 void skill_completed (void);
88
89 public:
90 ~Character (void);
91
92 /* Creates a character manager, needs API authentication. */
93 static CharacterPtr create (EveApiAuth const& auth);
94
95 /* API requests. Callers should obey the cache timers. */
96 void request_charsheet (void);
97 void request_skillqueue (void);
98
99 /* Updates the live information, typically called every second. */
100 void update_live_info (void);
101 /* Updates the character with completed skills from the queue. */
102 void update_from_queue (void);
103
104 /* Getters and worked-up information. */
105 std::string get_char_name (void) const;
106 std::string const& get_user_id (void) const;
107 std::string const& get_char_id (void) const;
108 std::string get_training_text (void) const;
109 std::string get_remaining_text (bool slim = false) const;
110 std::string get_summary_text (bool detailed);
111 bool is_training (void) const;
112
113 bool valid_training_sheet (void);
114 bool valid_character_sheet (void);
115
116 /* Signals. */
117 SignalRequestError& signal_request_error (void);
118 SignalCachedWarning& signal_cached_warning (void);
119 SignalNameAvailable& signal_name_available (void);
120 SignalApiInfoChanged& signal_api_info_changed (void);
121 SignalCharSheetUpdated& signal_char_sheet_updated (void);
122 SignalSkillQueueUpdated& signal_skill_queue_updated (void);
123 SignalSkillCompleted& signal_skill_completed (void);
124 SignalTrainingChanged& signal_training_changed (void);
125 };
126
127 /* ---------------------------------------------------------------- */
128
129 inline CharacterPtr
create(EveApiAuth const & auth)130 Character::create (EveApiAuth const& auth)
131 {
132 return CharacterPtr(new Character(auth));
133 }
134
135 inline std::string const&
get_user_id(void)136 Character::get_user_id (void) const
137 {
138 return this->auth.user_id;
139 }
140
141 inline std::string const&
get_char_id(void)142 Character::get_char_id (void) const
143 {
144 return this->auth.char_id;
145 }
146
147 inline void
request_charsheet(void)148 Character::request_charsheet (void)
149 {
150 if (!this->cs_fetcher.is_busy())
151 this->cs_fetcher.async_request();
152 }
153
154 inline void
request_skillqueue(void)155 Character::request_skillqueue (void)
156 {
157 if (!this->sq_fetcher.is_busy())
158 this->sq_fetcher.async_request();
159 }
160
161 inline bool
is_training(void)162 Character::is_training (void) const
163 {
164 return this->sq->valid && this->sq->in_training();
165 }
166
167 inline bool
valid_character_sheet(void)168 Character::valid_character_sheet (void)
169 {
170 return this->cs.get() && this->cs->valid;
171 }
172
173 inline bool
valid_training_sheet(void)174 Character::valid_training_sheet (void)
175 {
176 return this->sq.get() && this->sq->valid;
177 }
178
179 inline Character::SignalRequestError&
signal_request_error(void)180 Character::signal_request_error (void)
181 {
182 return this->sig_request_error;
183 }
184
185 inline Character::SignalCachedWarning&
signal_cached_warning(void)186 Character::signal_cached_warning (void)
187 {
188 return this->sig_cached_warning;
189 }
190
191 inline Character::SignalNameAvailable&
signal_name_available(void)192 Character::signal_name_available (void)
193 {
194 return this->sig_name_available;
195 }
196
197 inline Character::SignalApiInfoChanged&
signal_api_info_changed(void)198 Character::signal_api_info_changed (void)
199 {
200 return this->sig_api_info_changed;
201 }
202
203 inline Character::SignalCharSheetUpdated&
signal_char_sheet_updated(void)204 Character::signal_char_sheet_updated (void)
205 {
206 return this->sig_char_sheet_updated;
207 }
208
209 inline Character::SignalSkillQueueUpdated&
signal_skill_queue_updated(void)210 Character::signal_skill_queue_updated (void)
211 {
212 return this->sig_skill_queue_updated;
213 }
214
215 inline Character::SignalSkillCompleted&
signal_skill_completed(void)216 Character::signal_skill_completed (void)
217 {
218 return this->sig_skill_completed;
219 }
220
221 inline Character::SignalTrainingChanged&
signal_training_changed(void)222 Character::signal_training_changed (void)
223 {
224 return this->sig_training_changed;
225 }
226
227 #endif /* CHARACTER_HEADER */
228