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