EvEmu  0.8.4
11 September 2021
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
TutorialService.cpp
Go to the documentation of this file.
1 /*
2  ------------------------------------------------------------------------------------
3  LICENSE:
4  ------------------------------------------------------------------------------------
5  This file is part of EVEmu: EVE Online Server Emulator
6  Copyright 2006 - 2021 The EVEmu Team
7  For the latest information visit https://evemu.dev
8  ------------------------------------------------------------------------------------
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU Lesser General Public License as published by the Free Software
11  Foundation; either version 2 of the License, or (at your option) any later
12  version.
13 
14  This program is distributed in the hope that it will be useful, but WITHOUT
15  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
17 
18  You should have received a copy of the GNU Lesser General Public License along with
19  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
20  Place - Suite 330, Boston, MA 02111-1307, USA, or go to
21  http://www.gnu.org/copyleft/lesser.txt.
22  ------------------------------------------------------------------------------------
23  Author: Zhur, Allan
24 */
25 
26 #include "eve-server.h"
27 
28 #include "PyServiceCD.h"
30 
32 
34 : PyService(mgr, "tutorialSvc"),
35  m_dispatch(new Dispatcher(this))
36 {
37  _SetCallDispatcher(m_dispatch);
38 
39  PyCallable_REG_CALL(TutorialService, GetTutorials);
40  PyCallable_REG_CALL(TutorialService, GetTutorialInfo);
41  PyCallable_REG_CALL(TutorialService, GetTutorialAgents);
42  PyCallable_REG_CALL(TutorialService, GetCriterias);
43  PyCallable_REG_CALL(TutorialService, GetCategories);
44  PyCallable_REG_CALL(TutorialService, GetContextHelp);
45  PyCallable_REG_CALL(TutorialService, GetCharacterTutorialState);
46  PyCallable_REG_CALL(TutorialService, GetTutorialsAndConnections);
47  PyCallable_REG_CALL(TutorialService, GetCareerAgents);
48 }
49 
51  delete m_dispatch;
52 }
53 
54 PyResult TutorialService::Handle_GetTutorials(PyCallArgs &call) {
55  sLog.Warning( "TutorialService::Handle_GetTutorials()", "size= %u", call.tuple->size() );
56  call.Dump(SERVICE__CALL_DUMP);
57  return(m_db.GetAllTutorials());
58 }
59 
60 PyResult TutorialService::Handle_GetTutorialInfo(PyCallArgs &call) {
61  sLog.Warning( "TutorialService::Handle_GetTutorialInfo()", "size= %u", call.tuple->size() );
62  call.Dump(SERVICE__CALL_DUMP);
63  Call_GetTutorialInfo args;
64  if (!args.Decode(&call.tuple)) {
65  codelog(SERVICE__ERROR, "%s: Failed to decode arguments.", GetName());
66  return nullptr;
67  }
68 
69  Rsp_GetTutorialInfo rsp;
70 
71  rsp.pagecriterias = m_db.GetPageCriterias(args.tutorialID);
72  if(rsp.pagecriterias == NULL) {
73  codelog(SERVICE__ERROR, "An error occured while getting pagecriterias for tutorial %u.", args.tutorialID);
74  return nullptr;
75  }
76 
77  rsp.pages = m_db.GetPages(args.tutorialID);
78  if(rsp.pages == NULL) {
79  codelog(SERVICE__ERROR, "An error occured while getting pages for tutorial %u.", args.tutorialID);
80  return nullptr;
81  }
82 
83  rsp.tutorial = m_db.GetTutorial(args.tutorialID);
84  if(rsp.tutorial == NULL) {
85  codelog(SERVICE__ERROR, "An error occured while getting tutorial %u.", args.tutorialID);
86  return nullptr;
87  }
88 
89  rsp.criterias = m_db.GetTutorialCriterias(args.tutorialID);
90  if(rsp.criterias == NULL) {
91  codelog(SERVICE__ERROR, "An error occured while getting criterias for tutorial %u.", args.tutorialID);
92  return nullptr;
93  }
94 
95  return(rsp.Encode());
96 }
97 
98 PyResult TutorialService::Handle_GetTutorialAgents(PyCallArgs &call) {
99  /* this should be cached
100  [PyTuple 4 items]
101  [PyInt 1]
102  [PyString "GetTutorialAgents"]
103  [PyTuple 1 items]
104  [PyList 12 items]
105  [PyInt 3018921]
106  [PyInt 3019349]
107  [PyInt 3019337]
108  [PyInt 3018935]
109  [PyInt 3019371]
110  [PyInt 3019355]
111  [PyInt 3018923]
112  [PyInt 3019341]
113  [PyInt 3019333]
114  [PyInt 3018920]
115  [PyInt 3019346]
116  [PyInt 3019343]
117  [PyDict 1 kvp]
118  [PyString "machoVersion"]
119  [PyInt 1]
120 
121  [PySubStream 377 bytes]
122  [PyList 12 items]
123  [PyPackedRow 28 bytes]
124  ["agentID" => <3018920> [I4]]
125  ["agentTypeID" => <8> [I4]]
126  ["divisionID" => <22> [I4]]
127  ["level" => <1> [UI1]]
128  ["stationID" => <60015037> [I4]]
129  ["bloodlineID" => <14> [UI1]]
130  ["quality" => <0> [I4]]
131  ["corporationID" => <0> [I4]]
132  ["gender" => <0> [Bool]]
133  [PyPackedRow 28 bytes]
134  ["agentID" => <3018921> [I4]]
135  ["agentTypeID" => <8> [I4]]
136  ["divisionID" => <22> [I4]]
137  ["level" => <1> [UI1]]
138  ["stationID" => <60015021> [I4]]
139  ["bloodlineID" => <6> [UI1]]
140  ["quality" => <0> [I4]]
141  ["corporationID" => <0> [I4]]
142  ["gender" => <1> [Bool]]
143  [PyPackedRow 28 bytes]
144  ["agentID" => <3018923> [I4]]
145  ["agentTypeID" => <8> [I4]]
146  ["divisionID" => <22> [I4]]
147  ["level" => <1> [UI1]]
148  ["stationID" => <60015029> [I4]]
149  ["bloodlineID" => <12> [UI1]]
150  ["quality" => <0> [I4]]
151  ["corporationID" => <0> [I4]]
152  ["gender" => <1> [Bool]]
153  [PyPackedRow 28 bytes]
154  ["agentID" => <3018935> [I4]]
155  ["agentTypeID" => <8> [I4]]
156  ["divisionID" => <22> [I4]]
157  ["level" => <1> [UI1]]
158  ["stationID" => <60015027> [I4]]
159  ["bloodlineID" => <11> [UI1]]
160  ["quality" => <0> [I4]]
161  ["corporationID" => <0> [I4]]
162  ["gender" => <1> [Bool]]
163  [PyPackedRow 28 bytes]
164  ["agentID" => <3019333> [I4]]
165  ["agentTypeID" => <8> [I4]]
166  ["divisionID" => <22> [I4]]
167  ["level" => <1> [UI1]]
168  ["stationID" => <60015036> [I4]]
169  ["bloodlineID" => <7> [UI1]]
170  ["quality" => <0> [I4]]
171  ["corporationID" => <0> [I4]]
172  ["gender" => <1> [Bool]]
173  [PyPackedRow 28 bytes]
174  ["agentID" => <3019337> [I4]]
175  ["agentTypeID" => <8> [I4]]
176  ["divisionID" => <22> [I4]]
177  ["level" => <1> [UI1]]
178  ["stationID" => <60015010> [I4]]
179  ["bloodlineID" => <5> [UI1]]
180  ["quality" => <0> [I4]]
181  ["corporationID" => <0> [I4]]
182  ["gender" => <1> [Bool]]
183  [PyPackedRow 28 bytes]
184  ["agentID" => <3019341> [I4]]
185  ["agentTypeID" => <8> [I4]]
186  ["divisionID" => <22> [I4]]
187  ["level" => <1> [UI1]]
188  ["stationID" => <60015016> [I4]]
189  ["bloodlineID" => <8> [UI1]]
190  ["quality" => <0> [I4]]
191  ["corporationID" => <0> [I4]]
192  ["gender" => <1> [Bool]]
193  [PyPackedRow 28 bytes]
194  ["agentID" => <3019343> [I4]]
195  ["agentTypeID" => <8> [I4]]
196  ["divisionID" => <22> [I4]]
197  ["level" => <1> [UI1]]
198  ["stationID" => <60015041> [I4]]
199  ["bloodlineID" => <3> [UI1]]
200  ["quality" => <0> [I4]]
201  ["corporationID" => <0> [I4]]
202  ["gender" => <1> [Bool]]
203  [PyPackedRow 28 bytes]
204  ["agentID" => <3019346> [I4]]
205  ["agentTypeID" => <8> [I4]]
206  ["divisionID" => <22> [I4]]
207  ["level" => <1> [UI1]]
208  ["stationID" => <60015046> [I4]]
209  ["bloodlineID" => <4> [UI1]]
210  ["quality" => <0> [I4]]
211  ["corporationID" => <0> [I4]]
212  ["gender" => <1> [Bool]]
213  [PyPackedRow 28 bytes]
214  ["agentID" => <3019349> [I4]]
215  ["agentTypeID" => <8> [I4]]
216  ["divisionID" => <22> [I4]]
217  ["level" => <1> [UI1]]
218  ["stationID" => <60015020> [I4]]
219  ["bloodlineID" => <13> [UI1]]
220  ["quality" => <0> [I4]]
221  ["corporationID" => <0> [I4]]
222  ["gender" => <0> [Bool]]
223  [PyPackedRow 28 bytes]
224  ["agentID" => <3019355> [I4]]
225  ["agentTypeID" => <8> [I4]]
226  ["divisionID" => <22> [I4]]
227  ["level" => <1> [UI1]]
228  ["stationID" => <60015005> [I4]]
229  ["bloodlineID" => <11> [UI1]]
230  ["quality" => <0> [I4]]
231  ["corporationID" => <0> [I4]]
232  ["gender" => <0> [Bool]]
233  [PyPackedRow 28 bytes]
234  ["agentID" => <3019371> [I4]]
235  ["agentTypeID" => <8> [I4]]
236  ["divisionID" => <22> [I4]]
237  ["level" => <1> [UI1]]
238  ["stationID" => <60015001> [I4]]
239  ["bloodlineID" => <1> [UI1]]
240  ["quality" => <0> [I4]]
241  ["corporationID" => <0> [I4]]
242  ["gender" => <1> [Bool]]
243  */
244  sLog.White( "TutorialService::Handle_GetTutorialAgents()", "size= %u", call.tuple->size() );
245  call.Dump(SERVICE__CALL_DUMP);
246 
247  return new PyInt( 0 );
248 }
249 
250 PyResult TutorialService::Handle_GetCriterias(PyCallArgs &call) {
251  sLog.White( "TutorialService::Handle_GetCriterias()", "size= %u", call.tuple->size() );
252  call.Dump(SERVICE__CALL_DUMP);
253  return(m_db.GetAllCriterias());
254 }
255 
256 PyResult TutorialService::Handle_GetCategories(PyCallArgs &call) {
257  sLog.White( "TutorialService::Handle_GetCategories()", "size= %u", call.tuple->size() );
258  call.Dump(SERVICE__CALL_DUMP);
259  return(m_db.GetCategories());
260 }
261 
262 PyResult TutorialService::Handle_GetContextHelp( PyCallArgs& call )
263 {
264  sLog.White( "TutorialService::Handle_GetContextHelp()", "size= %u", call.tuple->size() );
265  call.Dump(SERVICE__CALL_DUMP);
266 
267  return nullptr;
268  /*
269  [PyObjectEx Type2]
270  [PyTuple 2 items]
271  [PyTuple 1 items]
272  [PyToken dbutil.CRowset]
273  [PyDict 1 kvp]
274  [PyString "header"]
275  [PyObjectEx Normal]
276  [PyTuple 2 items]
277  [PyToken blue.DBRowDescriptor]
278  [PyTuple 1 items]
279  [PyTuple 5 items]
280  [PyTuple 2 items]
281  [PyString "tutorialID"]
282  [PyInt 3]
283  [PyTuple 2 items]
284  [PyString "tutorialName"]
285  [PyInt 130]
286  [PyTuple 2 items]
287  [PyString "nextTutorialID"]
288  [PyInt 3]
289  [PyTuple 2 items]
290  [PyString "categoryID"]
291  [PyInt 3]
292  [PyTuple 2 items]
293  [PyString "dataID"]
294  [PyInt 3]
295  [PyPackedRow 17 bytes]
296  ["tutorialID" => <202> [I4]]
297  ["tutorialName" => <empty string> [WStr]]
298  ["nextTutorialID" => <0> [I4]]
299  ["categoryID" => <0> [I4]]
300  ["dataID" => <7581092> [I4]]
301  [PyPackedRow 17 bytes]
302  ["tutorialID" => <165> [I4]]
303  ["tutorialName" => <Acceleration gates> [WStr]]
304  ["nextTutorialID" => <0> [I4]]
305  ["categoryID" => <1> [I4]]
306  ["dataID" => <3063144> [I4]]
307  [PyPackedRow 17 bytes]
308  ["tutorialID" => <196> [I4]]
309  ["tutorialName" => <Advanced Hacking> [WStr]]
310  ["nextTutorialID" => <0> [I4]]
311  ["categoryID" => <8> [I4]]
312  ["dataID" => <7482901> [I4]]
313  [PyPackedRow 17 bytes]
314  ["tutorialID" => <156> [I4]]
315  ["tutorialName" => <Afterburners> [WStr]]
316  ["nextTutorialID" => <0> [I4]]
317  ["categoryID" => <7> [I4]]
318  ["dataID" => <3064150> [I4]]
319  [PyPackedRow 17 bytes]
320  ["tutorialID" => <161> [I4]]
321  ["tutorialName" => <Armor tanking> [WStr]]
322  ["nextTutorialID" => <0> [I4]]
323  ["categoryID" => <7> [I4]]
324  ["dataID" => <3064171> [I4]]
325  [PyPackedRow 17 bytes]
326  ["tutorialID" => <136> [I4]]
327  ["tutorialName" => <Camera Movement> [WStr]]
328  ["nextTutorialID" => <115> [I4]]
329  ["categoryID" => <0> [I4]]
330  ["dataID" => <7236988> [I4]]
331  [PyPackedRow 17 bytes]
332  ["tutorialID" => <171> [I4]]
333  ["tutorialName" => <Career Advancement tutorial> [WStr]]
334  ["nextTutorialID" => <0> [I4]]
335  ["categoryID" => <0> [I4]]
336  ["dataID" => <3257608> [I4]]
337  [PyPackedRow 17 bytes]
338  ["tutorialID" => <134> [I4]]
339  ["tutorialName" => <Certificates> [WStr]]
340  ["nextTutorialID" => <0> [I4]]
341  ["categoryID" => <1> [I4]]
342  ["dataID" => <2975451> [I4]]
343  [PyPackedRow 17 bytes]
344  ["tutorialID" => <201> [I4]]
345  ["tutorialName" => <Combat Tactics> [WStr]]
346  ["nextTutorialID" => <0> [I4]]
347  ["categoryID" => <9> [I4]]
348  ["dataID" => <7543524> [I4]]
349  [PyPackedRow 17 bytes]
350  ["tutorialID" => <158> [I4]]
351  ["tutorialName" => <Damage Types> [WStr]]
352  ["nextTutorialID" => <0> [I4]]
353  ["categoryID" => <7> [I4]]
354  ["dataID" => <3064192> [I4]]
355  [PyPackedRow 17 bytes]
356  ["tutorialID" => <164> [I4]]
357  ["tutorialName" => <Exploration> [WStr]]
358  ["nextTutorialID" => <0> [I4]]
359  ["categoryID" => <10> [I4]]
360  ["dataID" => <7499248> [I4]]
361  [PyPackedRow 17 bytes]
362  ["tutorialID" => <128> [I4]]
363  ["tutorialName" => <Finding a corporation to join> [WStr]]
364  ["nextTutorialID" => <0> [I4]]
365  ["categoryID" => <1> [I4]]
366  ["dataID" => <2975450> [I4]]
367  [PyPackedRow 17 bytes]
368  ["tutorialID" => <193> [I4]]
369  ["tutorialName" => <Finding Cosmic Anomalies> [WStr]]
370  ["nextTutorialID" => <0> [I4]]
371  ["categoryID" => <10> [I4]]
372  ["dataID" => <7499243> [I4]]
373  [PyPackedRow 17 bytes]
374  ["tutorialID" => <163> [I4]]
375  ["tutorialName" => <Fitting your ship> [WStr]]
376  ["nextTutorialID" => <162> [I4]]
377  ["categoryID" => <0> [I4]]
378  ["dataID" => <7237141> [I4]]
379  [PyPackedRow 17 bytes]
380  ["tutorialID" => <153> [I4]]
381  ["tutorialName" => <Guns and Ammo> [WStr]]
382  ["nextTutorialID" => <0> [I4]]
383  ["categoryID" => <7> [I4]]
384  ["dataID" => <3064219> [I4]]
385  [PyPackedRow 17 bytes]
386  ["tutorialID" => <140> [I4]]
387  ["tutorialName" => <Hacking> [WStr]]
388  ["nextTutorialID" => <0> [I4]]
389  ["categoryID" => <8> [I4]]
390  ["dataID" => <2939334> [I4]]
391  [PyPackedRow 17 bytes]
392  ["tutorialID" => <123> [I4]]
393  ["tutorialName" => <Heat> [WStr]]
394  ["nextTutorialID" => <0> [I4]]
395  ["categoryID" => <7> [I4]]
396  ["dataID" => <2975444> [I4]]
397  [PyPackedRow 17 bytes]
398  ["tutorialID" => <159> [I4]]
399  ["tutorialName" => <Implants> [WStr]]
400  ["nextTutorialID" => <0> [I4]]
401  ["categoryID" => <1> [I4]]
402  ["dataID" => <2969669> [I4]]
403  [PyPackedRow 17 bytes]
404  ["tutorialID" => <197> [I4]]
405  ["tutorialName" => <Ladar Sites> [WStr]]
406  ["nextTutorialID" => <0> [I4]]
407  ["categoryID" => <10> [I4]]
408  ["dataID" => <7499824> [I4]]
409  [PyPackedRow 17 bytes]
410  ["tutorialID" => <195> [I4]]
411  ["tutorialName" => <Magnetometric Sites> [WStr]]
412  ["nextTutorialID" => <0> [I4]]
413  ["categoryID" => <10> [I4]]
414  ["dataID" => <7499825> [I4]]
415  [PyPackedRow 17 bytes]
416  ["tutorialID" => <146> [I4]]
417  ["tutorialName" => <Manufacturing> [WStr]]
418  ["nextTutorialID" => <0> [I4]]
419  ["categoryID" => <5> [I4]]
420  ["dataID" => <2975442> [I4]]
421  [PyPackedRow 17 bytes]
422  ["tutorialID" => <178> [I4]]
423  ["tutorialName" => <Minimizing your losses> [WStr]]
424  ["nextTutorialID" => <0> [I4]]
425  ["categoryID" => <9> [I4]]
426  ["dataID" => <7483043> [I4]]
427  [PyPackedRow 17 bytes]
428  ["tutorialID" => <145> [I4]]
429  ["tutorialName" => <Mining> [WStr]]
430  ["nextTutorialID" => <0> [I4]]
431  ["categoryID" => <5> [I4]]
432  ["dataID" => <2946197> [I4]]
433  [PyPackedRow 17 bytes]
434  ["tutorialID" => <170> [I4]]
435  ["tutorialName" => <Multiple acceleration gates> [WStr]]
436  ["nextTutorialID" => <0> [I4]]
437  ["categoryID" => <1> [I4]]
438  ["dataID" => <3256368> [I4]]
439  [PyPackedRow 17 bytes]
440  ["tutorialID" => <150> [I4]]
441  ["tutorialName" => <Orbiting Effectively> [WStr]]
442  ["nextTutorialID" => <0> [I4]]
443  ["categoryID" => <7> [I4]]
444  ["dataID" => <2947987> [I4]]
445  [PyPackedRow 17 bytes]
446  ["tutorialID" => <151> [I4]]
447  ["tutorialName" => <Overview Settings> [WStr]]
448  ["nextTutorialID" => <0> [I4]]
449  ["categoryID" => <1> [I4]]
450  ["dataID" => <2948380> [I4]]
451  [PyPackedRow 17 bytes]
452  ["tutorialID" => <129> [I4]]
453  ["tutorialName" => <Placing recruitment adverts> [WStr]]
454  ["nextTutorialID" => <0> [I4]]
455  ["categoryID" => <6> [I4]]
456  ["dataID" => <2975370> [I4]]
457  [PyPackedRow 17 bytes]
458  ["tutorialID" => <187> [I4]]
459  ["tutorialName" => <Racial Weapon: Drones> [WStr]]
460  ["nextTutorialID" => <0> [I4]]
461  ["categoryID" => <9> [I4]]
462  ["dataID" => <7483045> [I4]]
463  [PyPackedRow 17 bytes]
464  ["tutorialID" => <183> [I4]]
465  ["tutorialName" => <Racial Weapon: Laser Turrets> [WStr]]
466  ["nextTutorialID" => <0> [I4]]
467  ["categoryID" => <9> [I4]]
468  ["dataID" => <7483046> [I4]]
469  [PyPackedRow 17 bytes]
470  ["tutorialID" => <184> [I4]]
471  ["tutorialName" => <Racial Weapon: Missiles> [WStr]]
472  ["nextTutorialID" => <0> [I4]]
473  ["categoryID" => <9> [I4]]
474  ["dataID" => <7483048> [I4]]
475  [PyPackedRow 17 bytes]
476  ["tutorialID" => <185> [I4]]
477  ["tutorialName" => <Racial Weapon: Projectile Turrets> [WStr]]
478  ["nextTutorialID" => <0> [I4]]
479  ["categoryID" => <9> [I4]]
480  ["dataID" => <7483047> [I4]]
481  [PyPackedRow 17 bytes]
482  ["tutorialID" => <173> [I4]]
483  ["tutorialName" => <Remote Agent Conversation> [WStr]]
484  ["nextTutorialID" => <0> [I4]]
485  ["categoryID" => <12> [I4]]
486  ["dataID" => <7557616> [I4]]
487  [PyPackedRow 17 bytes]
488  ["tutorialID" => <181> [I4]]
489  ["tutorialName" => <Remote Repair Modules> [WStr]]
490  ["nextTutorialID" => <0> [I4]]
491  ["categoryID" => <9> [I4]]
492  ["dataID" => <7483049> [I4]]
493  [PyPackedRow 17 bytes]
494  ["tutorialID" => <122> [I4]]
495  ["tutorialName" => <Salvaging> [WStr]]
496  ["nextTutorialID" => <0> [I4]]
497  ["categoryID" => <8> [I4]]
498  ["dataID" => <2939075> [I4]]
499  [PyPackedRow 17 bytes]
500  ["tutorialID" => <155> [I4]]
501  ["tutorialName" => <Shield tanking> [WStr]]
502  ["nextTutorialID" => <0> [I4]]
503  ["categoryID" => <7> [I4]]
504  ["dataID" => <3064194> [I4]]
505  [PyPackedRow 17 bytes]
506  ["tutorialID" => <190> [I4]]
507  ["tutorialName" => <Shield Transporters> [WStr]]
508  ["nextTutorialID" => <0> [I4]]
509  ["categoryID" => <9> [I4]]
510  ["dataID" => <7483050> [I4]]
511  [PyPackedRow 17 bytes]
512  ["tutorialID" => <137> [I4]]
513  ["tutorialName" => <Ship Movement> [WStr]]
514  ["nextTutorialID" => <112> [I4]]
515  ["categoryID" => <0> [I4]]
516  ["dataID" => <3255036> [I4]]
517  [PyPackedRow 17 bytes]
518  ["tutorialID" => <162> [I4]]
519  ["tutorialName" => <Skill Training Queue> [WStr]]
520  ["nextTutorialID" => <44> [I4]]
521  ["categoryID" => <0> [I4]]
522  ["dataID" => <7237142> [I4]]
523  [PyPackedRow 17 bytes]
524  ["tutorialID" => <188> [I4]]
525  ["tutorialName" => <Stasis Webifiers> [WStr]]
526  ["nextTutorialID" => <0> [I4]]
527  ["categoryID" => <9> [I4]]
528  ["dataID" => <7483052> [I4]]
529  [PyPackedRow 17 bytes]
530  ["tutorialID" => <166> [I4]]
531  ["tutorialName" => <Superior ship> [WStr]]
532  ["nextTutorialID" => <0> [I4]]
533  ["categoryID" => <1> [I4]]
534  ["dataID" => <3063540> [I4]]
535  [PyPackedRow 17 bytes]
536  ["tutorialID" => <152> [I4]]
537  ["tutorialName" => <Using your new ship> [WStr]]
538  ["nextTutorialID" => <0> [I4]]
539  ["categoryID" => <1> [I4]]
540  ["dataID" => <2949658> [I4]]
541  [PyPackedRow 17 bytes]
542  ["tutorialID" => <180> [I4]]
543  ["tutorialName" => <Warp Disruptors and Warp Scramblers> [WStr]]
544  ["nextTutorialID" => <0> [I4]]
545  ["categoryID" => <9> [I4]]
546  ["dataID" => <7483051> [I4]]
547  [PyPackedRow 17 bytes]
548  ["tutorialID" => <169> [I4]]
549  ["tutorialName" => <While you wait> [WStr]]
550  ["nextTutorialID" => <0> [I4]]
551  ["categoryID" => <0> [I4]]
552  ["dataID" => <3250585> [I4]]
553  [PyPackedRow 17 bytes]
554  ["tutorialID" => <27> [I4]]
555  ["tutorialName" => <Medical clones> [WStr]]
556  ["nextTutorialID" => <0> [I4]]
557  ["categoryID" => <1> [I4]]
558  ["dataID" => <7562238> [I4]]
559  [PyPackedRow 17 bytes]
560  ["tutorialID" => <41> [I4]]
561  ["tutorialName" => <Insuring Your Ship> [WStr]]
562  ["nextTutorialID" => <0> [I4]]
563  ["categoryID" => <1> [I4]]
564  ["dataID" => <7537039> [I4]]
565  [PyPackedRow 17 bytes]
566  ["tutorialID" => <54> [I4]]
567  ["tutorialName" => <Contracts> [WStr]]
568  ["nextTutorialID" => <0> [I4]]
569  ["categoryID" => <6> [I4]]
570  ["dataID" => <2975440> [I4]]
571  [PyPackedRow 17 bytes]
572  ["tutorialID" => <62> [I4]]
573  ["tutorialName" => <Attributes> [WStr]]
574  ["nextTutorialID" => <0> [I4]]
575  ["categoryID" => <1> [I4]]
576  ["dataID" => <2837579> [I4]]
577  [PyPackedRow 17 bytes]
578  ["tutorialID" => <91> [I4]]
579  ["tutorialName" => <Creating and managing a corporation> [WStr]]
580  ["nextTutorialID" => <0> [I4]]
581  ["categoryID" => <6> [I4]]
582  ["dataID" => <2975411> [I4]]
583  [PyPackedRow 17 bytes]
584  ["tutorialID" => <115> [I4]]
585  ["tutorialName" => <Your advancement> [WStr]]
586  ["nextTutorialID" => <137> [I4]]
587  ["categoryID" => <0> [I4]]
588  ["dataID" => <7236991> [I4]]
589  [PyPackedRow 17 bytes]
590  ["tutorialID" => <9> [I4]]
591  ["tutorialName" => <Reprocessing and Refining> [WStr]]
592  ["nextTutorialID" => <0> [I4]]
593  ["categoryID" => <5> [I4]]
594  ["dataID" => <2940486> [I4]]
595  [PyPackedRow 17 bytes]
596  ["tutorialID" => <12> [I4]]
597  ["tutorialName" => <Market> [WStr]]
598  ["nextTutorialID" => <0> [I4]]
599  ["categoryID" => <6> [I4]]
600  ["dataID" => <3064223> [I4]]
601  [PyPackedRow 17 bytes]
602  ["tutorialID" => <13> [I4]]
603  ["tutorialName" => <Fitting Station Service> [WStr]]
604  ["nextTutorialID" => <0> [I4]]
605  ["categoryID" => <1> [I4]]
606  ["dataID" => <2975453> [I4]]
607  [PyPackedRow 17 bytes]
608  ["tutorialID" => <14> [I4]]
609  ["tutorialName" => <Map> [WStr]]
610  ["nextTutorialID" => <0> [I4]]
611  ["categoryID" => <1> [I4]]
612  ["dataID" => <2975454> [I4]]
613  [PyPackedRow 17 bytes]
614  ["tutorialID" => <15> [I4]]
615  ["tutorialName" => <People & Places> [WStr]]
616  ["nextTutorialID" => <0> [I4]]
617  ["categoryID" => <1> [I4]]
618  ["dataID" => <2975455> [I4]]
619  [PyPackedRow 17 bytes]
620  ["tutorialID" => <46> [I4]]
621  ["tutorialName" => <Repairshop> [WStr]]
622  ["nextTutorialID" => <0> [I4]]
623  ["categoryID" => <1> [I4]]
624  ["dataID" => <2975456> [I4]]
625  [PyPackedRow 17 bytes]
626  ["tutorialID" => <109> [I4]]
627  ["tutorialName" => <Crash Course> [WStr]]
628  ["nextTutorialID" => <110> [I4]]
629  ["categoryID" => <1> [I4]]
630  ["dataID" => <2972568> [I4]]
631  [PyPackedRow 17 bytes]
632  ["tutorialID" => <110> [I4]]
633  ["tutorialName" => <Basic Commands> [WStr]]
634  ["nextTutorialID" => <136> [I4]]
635  ["categoryID" => <0> [I4]]
636  ["dataID" => <7236989> [I4]]
637  [PyPackedRow 17 bytes]
638  ["tutorialID" => <112> [I4]]
639  ["tutorialName" => <Basic Combat> [WStr]]
640  ["nextTutorialID" => <117> [I4]]
641  ["categoryID" => <0> [I4]]
642  ["dataID" => <2826984> [I4]]
643  [PyPackedRow 17 bytes]
644  ["tutorialID" => <117> [I4]]
645  ["tutorialName" => <Warp back to station> [WStr]]
646  ["nextTutorialID" => <118> [I4]]
647  ["categoryID" => <0> [I4]]
648  ["dataID" => <2697> [I4]]
649  [PyPackedRow 17 bytes]
650  ["tutorialID" => <118> [I4]]
651  ["tutorialName" => <In Station> [WStr]]
652  ["nextTutorialID" => <163> [I4]]
653  ["categoryID" => <0> [I4]]
654  ["dataID" => <7237140> [I4]]
655  [PyPackedRow 17 bytes]
656  ["tutorialID" => <44> [I4]]
657  ["tutorialName" => <Agents> [WStr]]
658  ["nextTutorialID" => <121> [I4]]
659  ["categoryID" => <12> [I4]]
660  ["dataID" => <7557615> [I4]]
661  [PyPackedRow 17 bytes]
662  ["tutorialID" => <121> [I4]]
663  ["tutorialName" => <Next steps> [WStr]]
664  ["nextTutorialID" => <171> [I4]]
665  ["categoryID" => <0> [I4]]
666  ["dataID" => <3258306> [I4]]
667  [PyNone]
668  [PyToken dbutil.CRowset]
669  [PyDict 1 kvp]
670  [PyString "header"]
671  [PyObjectEx Normal]
672  [PyTuple 2 items]
673  [PyToken blue.DBRowDescriptor]
674  [PyTuple 1 items]
675  [PyTuple 6 items]
676  [PyTuple 2 items]
677  [PyString "contextID"]
678  [PyInt 3]
679  [PyTuple 2 items]
680  [PyString "keywords"]
681  [PyInt 130]
682  [PyTuple 2 items]
683  [PyString "url"]
684  [PyInt 130]
685  [PyTuple 2 items]
686  [PyString "description"]
687  [PyInt 130]
688  [PyTuple 2 items]
689  [PyString "published"]
690  [PyInt 11]
691  [PyTuple 2 items]
692  [PyString "tutorialID"]
693  [PyInt 3]
694  [PyPackedRow 9 bytes]
695  ["contextID" => <53> [I4]]
696  ["keywords" => <UI_SHARED_NOTEPAD> [WStr]]
697  ["url" => <http://wiki.eveonline.com/wiki/In_game_notepad> [WStr]]
698  ["description" => <The notepad> [WStr]]
699  ["published" => <0> [Bool]]
700  ["tutorialID" => <0> [I4]]
701  [PyPackedRow 9 bytes]
702  ["contextID" => <67> [I4]]
703  ["keywords" => <UI_SHARED_CHARACTERSHEET> [WStr]]
704  ["url" => <http://wiki.eveonline.com/wiki/Skill_training> [WStr]]
705  ["description" => <Skill training> [WStr]]
706  ["published" => <0> [Bool]]
707  ["tutorialID" => <159> [I4]]
708  [PyPackedRow 9 bytes]
709  ["contextID" => <68> [I4]]
710  ["keywords" => <UI_SHARED_CHARACTERSHEET> [WStr]]
711  ["url" => <http://wiki.eveonline.com/wiki/Standings_Mechanics> [WStr]]
712  ["description" => <What are my standings and what do they do?> [WStr]]
713  ["published" => <0> [Bool]]
714  ["tutorialID" => <62> [I4]]
715  [PyPackedRow 9 bytes]
716  ["contextID" => <69> [I4]]
717  ["keywords" => <UI_SHARED_CHARACTERSHEET> [WStr]]
718  ["url" => <http://wiki.eveonline.com/wiki/Attributes_in_EVE> [WStr]]
719  ["description" => <Attributes in EVE> [WStr]]
720  ["published" => <0> [Bool]]
721  ["tutorialID" => <0> [I4]]
722  [PyPackedRow 9 bytes]
723  ["contextID" => <70> [I4]]
724  ["keywords" => <UI_SHARED_CHARACTERSHEET> [WStr]]
725  ["url" => <http://wiki.eveonline.com/wiki/Races> [WStr]]
726  ["description" => <Races and bloodlines in EVE> [WStr]]
727  ["published" => <0> [Bool]]
728  ["tutorialID" => <0> [I4]]
729  [PyPackedRow 9 bytes]
730  ["contextID" => <71> [I4]]
731  ["keywords" => <UI_SHARED_CHARACTERSHEET> [WStr]]
732  ["url" => <http://wiki.eveonline.com/wiki/Skill_training> [WStr]]
733  ["description" => <Skill training queue> [WStr]]
734  ["published" => <0> [Bool]]
735  ["tutorialID" => <0> [I4]]
736  [PyPackedRow 9 bytes]
737  ["contextID" => <72> [I4]]
738  ["keywords" => <UI_SHARED_CHARACTERSHEET> [WStr]]
739  ["url" => <http://wiki.eveonline.com/wiki/Security_Status> [WStr]]
740  ["description" => <Security status and travelling restrictions> [WStr]]
741  ["published" => <0> [Bool]]
742  ["tutorialID" => <0> [I4]]
743  [PyPackedRow 9 bytes]
744  ["contextID" => <73> [I4]]
745  ["keywords" => <UI_SHARED_CHARACTERSHEET> [WStr]]
746  ["url" => <http://wiki.eveonline.com/wiki/Jump_clones> [WStr]]
747  ["description" => <Jump clones> [WStr]]
748  ["published" => <0> [Bool]]
749  ["tutorialID" => <0> [I4]]
750  [PyPackedRow 9 bytes]
751  ["contextID" => <74> [I4]]
752  ["keywords" => <UI_SHARED_CHARACTERSHEET> [WStr]]
753  ["url" => <http://wiki.eveonline.com/wiki/Neural_remapping> [WStr]]
754  ["description" => <Neural remapping> [WStr]]
755  ["published" => <0> [Bool]]
756  ["tutorialID" => <0> [I4]]
757  [PyPackedRow 9 bytes]
758  ["contextID" => <77> [I4]]
759  ["keywords" => <UI_MARKET_MARKET> [WStr]]
760  ["url" => <http://wiki.eveonline.com/wiki/Market_guide> [WStr]]
761  ["description" => <Market Guide> [WStr]]
762  ["published" => <0> [Bool]]
763  ["tutorialID" => <12> [I4]]
764  [PyPackedRow 9 bytes]
765  ["contextID" => <79> [I4]]
766  ["keywords" => <UI_CORP_ASSETS> [WStr]]
767  ["url" => <http://wiki.eveonline.com/wiki/Assets> [WStr]]
768  ["description" => <Your assets> [WStr]]
769  ["published" => <0> [Bool]]
770  ["tutorialID" => <0> [I4]]
771  [PyPackedRow 9 bytes]
772  ["contextID" => <80> [I4]]
773  ["keywords" => <UI_RMR_SCIENCEANDINDUSTRY> [WStr]]
774  ["url" => <http://wiki.eveonline.com/wiki/Research_and_manufacturing> [WStr]]
775  ["description" => <Production/research job time> [WStr]]
776  ["published" => <0> [Bool]]
777  ["tutorialID" => <146> [I4]]
778  [PyPackedRow 9 bytes]
779  ["contextID" => <81> [I4]]
780  ["keywords" => <UI_RMR_SCIENCEANDINDUSTRY> [WStr]]
781  ["url" => <http://wiki.eveonline.com/wiki/Researching_Blueprints> [WStr]]
782  ["description" => <Researching blueprints> [WStr]]
783  ["published" => <0> [Bool]]
784  ["tutorialID" => <0> [I4]]
785  [PyPackedRow 9 bytes]
786  ["contextID" => <82> [I4]]
787  ["keywords" => <UI_RMR_SCIENCEANDINDUSTRY> [WStr]]
788  ["url" => <http://wiki.eveonline.com/wiki/Research_and_manufacturing> [WStr]]
789  ["description" => <Researching and copying Tech Level II blueprints> [WStr]]
790  ["published" => <0> [Bool]]
791  ["tutorialID" => <0> [I4]]
792  [PyPackedRow 9 bytes]
793  ["contextID" => <83> [I4]]
794  ["keywords" => <UI_RMR_SCIENCEANDINDUSTRY> [WStr]]
795  ["url" => <http://wiki.eveonline.com/wiki/Tech_Level_II_production> [WStr]]
796  ["description" => <Tech Level II production> [WStr]]
797  ["published" => <0> [Bool]]
798  ["tutorialID" => <0> [I4]]
799  [PyPackedRow 9 bytes]
800  ["contextID" => <84> [I4]]
801  ["keywords" => <UI_RMR_SCIENCEANDINDUSTRY> [WStr]]
802  ["url" => <http://wiki.eveonline.com/wiki/Ice_Harvesting> [WStr]]
803  ["description" => <Ice Harvesting> [WStr]]
804  ["published" => <0> [Bool]]
805  ["tutorialID" => <0> [I4]]
806  [PyPackedRow 9 bytes]
807  ["contextID" => <86> [I4]]
808  ["keywords" => <UI_CONTRACTS_CONTRACTS> [WStr]]
809  ["url" => <http://wiki.eveonline.com/wiki/Contracts> [WStr]]
810  ["description" => <Contracts> [WStr]]
811  ["published" => <0> [Bool]]
812  ["tutorialID" => <54> [I4]]
813  [PyPackedRow 9 bytes]
814  ["contextID" => <87> [I4]]
815  ["keywords" => <UI_STATION_REPROCESSINGPLANT> [WStr]]
816  ["url" => <http://wiki.eveonline.com/wiki/Ice_Harvesting> [WStr]]
817  ["description" => <Ice Harvesting> [WStr]]
818  ["published" => <0> [Bool]]
819  ["tutorialID" => <9> [I4]]
820  [PyPackedRow 9 bytes]
821  ["contextID" => <88> [I4]]
822  ["keywords" => <UI_STATION_REPROCESSINGPLANT> [WStr]]
823  ["url" => <http://wiki.eveonline.com/wiki/Asteroids> [WStr]]
824  ["description" => <Asteroids> [WStr]]
825  ["published" => <0> [Bool]]
826  ["tutorialID" => <0> [I4]]
827  [PyPackedRow 9 bytes]
828  ["contextID" => <89> [I4]]
829  ["keywords" => <UI_STATION_REPROCESSINGPLANT> [WStr]]
830  ["url" => <http://wiki.eveonline.com/wiki/Minerals> [WStr]]
831  ["description" => <Minerals> [WStr]]
832  ["published" => <0> [Bool]]
833  ["tutorialID" => <0> [I4]]
834  [PyPackedRow 9 bytes]
835  ["contextID" => <90> [I4]]
836  ["keywords" => <UI_STATION_FITTING> [WStr]]
837  ["url" => <http://wiki.eveonline.com/wiki/Rigs> [WStr]]
838  ["description" => <Rigs> [WStr]]
839  ["published" => <0> [Bool]]
840  ["tutorialID" => <13> [I4]]
841  [PyPackedRow 9 bytes]
842  ["contextID" => <91> [I4]]
843  ["keywords" => <UI_STATION_REPAIRSHOP> [WStr]]
844  ["url" => <http://wiki.eveonline.com/wiki/Repackage> [WStr]]
845  ["description" => <Repackaging and repairing your ships and modules> [WStr]]
846  ["published" => <0> [Bool]]
847  ["tutorialID" => <46> [I4]]
848  [PyPackedRow 9 bytes]
849  ["contextID" => <92> [I4]]
850  ["keywords" => <UI_LPSTORE_LPSTORE> [WStr]]
851  ["url" => <http://wiki.eveonline.com/wiki/Loyalty_Points_and_Loyalty_Points_Store> [WStr]]
852  ["description" => <Loyalty Points and LP Store> [WStr]]
853  ["published" => <0> [Bool]]
854  ["tutorialID" => <0> [I4]]
855  [PyPackedRow 9 bytes]
856  ["contextID" => <93> [I4]]
857  ["keywords" => <UI_STATION_INSURANCE> [WStr]]
858  ["url" => <http://wiki.eveonline.com/wiki/Insurance> [WStr]]
859  ["description" => <Insurance> [WStr]]
860  ["published" => <0> [Bool]]
861  ["tutorialID" => <43> [I4]]
862  [PyPackedRow 9 bytes]
863  ["contextID" => <94> [I4]]
864  ["keywords" => <UI_STATION_MEDICAL> [WStr]]
865  ["url" => <http://wiki.eveonline.com/wiki/What_happens_when_my_character_dies> [WStr]]
866  ["description" => <What happens when my character dies?> [WStr]]
867  ["published" => <0> [Bool]]
868  ["tutorialID" => <27> [I4]]
869  [PyPackedRow 9 bytes]
870  ["contextID" => <95> [I4]]
871  ["keywords" => <UI_SHARED_MAPWORLDCTRLPANEL> [WStr]]
872  ["url" => <http://wiki.eveonline.com/wiki/Star_map> [WStr]]
873  ["description" => <The world map> [WStr]]
874  ["published" => <0> [Bool]]
875  ["tutorialID" => <14> [I4]]
876  [PyPackedRow 9 bytes]
877  ["contextID" => <97> [I4]]
878  ["keywords" => <UI_SHARED_WALLET> [WStr]]
879  ["url" => <http://wiki.eveonline.com/wiki/Wallet_configuration> [WStr]]
880  ["description" => <Wallet Configuration> [WStr]]
881  ["published" => <0> [Bool]]
882  ["tutorialID" => <0> [I4]]
883  [PyPackedRow 9 bytes]
884  ["contextID" => <99> [I4]]
885  ["keywords" => <UI_SHARED_PEOPLEANDPLACES> [WStr]]
886  ["url" => <http://wiki.eveonline.com/wiki/People_and_places> [WStr]]
887  ["description" => <I can't find a station/system> [WStr]]
888  ["published" => <0> [Bool]]
889  ["tutorialID" => <15> [I4]]
890  [PyPackedRow 9 bytes]
891  ["contextID" => <100> [I4]]
892  ["keywords" => <UI_SHARED_PEOPLEANDPLACES> [WStr]]
893  ["url" => <http://wiki.eveonline.com/wiki/Bookmarks> [WStr]]
894  ["description" => <How to use bookmarks> [WStr]]
895  ["published" => <0> [Bool]]
896  ["tutorialID" => <0> [I4]]
897  [PyPackedRow 9 bytes]
898  ["contextID" => <101> [I4]]
899  ["keywords" => <UI_SHARED_EVEMAIL> [WStr]]
900  ["url" => <http://wiki.eveonline.com/wiki/EVE_mail> [WStr]]
901  ["description" => <The EVE mail system> [WStr]]
902  ["published" => <0> [Bool]]
903  ["tutorialID" => <0> [I4]]
904  [PyPackedRow 9 bytes]
905  ["contextID" => <102> [I4]]
906  ["keywords" => <UI_SHARED_CHANNELS> [WStr]]
907  ["url" => <http://wiki.eveonline.com/wiki/Cant_see_anything_on_a_chat_channel> [WStr]]
908  ["description" => <Why can't I see anything on chat channels?> [WStr]]
909  ["published" => <0> [Bool]]
910  ["tutorialID" => <0> [I4]]
911  [PyPackedRow 9 bytes]
912  ["contextID" => <104> [I4]]
913  ["keywords" => <UI_GENERIC_JOURNAL> [WStr]]
914  ["url" => <http://wiki.eveonline.com/wiki/Mission_Journal> [WStr]]
915  ["description" => <Mission Journal overview> [WStr]]
916  ["published" => <0> [Bool]]
917  ["tutorialID" => <0> [I4]]
918  [PyPackedRow 9 bytes]
919  ["contextID" => <105> [I4]]
920  ["keywords" => <UI_GENERIC_JOURNAL> [WStr]]
921  ["url" => <http://wiki.eveonline.com/wiki/Research_agent> [WStr]]
922  ["description" => <Research points not updating> [WStr]]
923  ["published" => <0> [Bool]]
924  ["tutorialID" => <0> [I4]]
925  [PyPackedRow 9 bytes]
926  ["contextID" => <106> [I4]]
927  ["keywords" => <UI_GENERIC_JOURNAL> [WStr]]
928  ["url" => <http://wiki.eveonline.com/wiki/Loyalty_Points_and_Loyalty_Points_Store> [WStr]]
929  ["description" => <Loyalty Points and LP Store> [WStr]]
930  ["published" => <0> [Bool]]
931  ["tutorialID" => <0> [I4]]
932  [PyPackedRow 9 bytes]
933  ["contextID" => <107> [I4]]
934  ["keywords" => <UI_GENERIC_JOURNAL> [WStr]]
935  ["url" => <http://wiki.eveonline.com/wiki/Escalating_encounters> [WStr]]
936  ["description" => <Escalating encounters> [WStr]]
937  ["published" => <0> [Bool]]
938  ["tutorialID" => <0> [I4]]
939  [PyPackedRow 9 bytes]
940  ["contextID" => <108> [I4]]
941  ["keywords" => <UI_GENERIC_JOURNAL> [WStr]]
942  ["url" => <http://wiki.eveonline.com/wiki/Storyline_mission> [WStr]]
943  ["description" => <Storyline missions> [WStr]]
944  ["published" => <0> [Bool]]
945  ["tutorialID" => <0> [I4]]
946  [PyPackedRow 9 bytes]
947  ["contextID" => <109> [I4]]
948  ["keywords" => <UI_GENERIC_CORPORATION> [WStr]]
949  ["url" => <http://wiki.eveonline.com/wiki/CEO_replacement> [WStr]]
950  ["description" => <CEO replacement> [WStr]]
951  ["published" => <0> [Bool]]
952  ["tutorialID" => <128> [I4]]
953  [PyPackedRow 9 bytes]
954  ["contextID" => <110> [I4]]
955  ["keywords" => <UI_GENERIC_CORPORATION> [WStr]]
956  ["url" => <http://wiki.eveonline.com/wiki/Why_are_my_corporate_management_skills_not_working> [WStr]]
957  ["description" => <Why are my corporate management skills not working? > [WStr]]
958  ["published" => <0> [Bool]]
959  ["tutorialID" => <129> [I4]]
960  [PyPackedRow 9 bytes]
961  ["contextID" => <111> [I4]]
962  ["keywords" => <UI_GENERIC_CORPORATION> [WStr]]
963  ["url" => <http://wiki.eveonline.com/wiki/Putting_votes_into_action> [WStr]]
964  ["description" => <Putting votes into action> [WStr]]
965  ["published" => <0> [Bool]]
966  ["tutorialID" => <0> [I4]]
967  [PyPackedRow 9 bytes]
968  ["contextID" => <112> [I4]]
969  ["keywords" => <UI_GENERIC_CORPORATION> [WStr]]
970  ["url" => <http://wiki.eveonline.com/wiki/Renting_offices> [WStr]]
971  ["description" => <Renting Corporation Offices> [WStr]]
972  ["published" => <0> [Bool]]
973  ["tutorialID" => <91> [I4]]
974  [PyPackedRow 9 bytes]
975  ["contextID" => <113> [I4]]
976  ["keywords" => <UI_GENERIC_CORPORATION> [WStr]]
977  ["url" => <http://wiki.eveonline.com/wiki/Votes> [WStr]]
978  ["description" => <How are corporation votes used?> [WStr]]
979  ["published" => <0> [Bool]]
980  ["tutorialID" => <0> [I4]]
981  [PyPackedRow 9 bytes]
982  ["contextID" => <115> [I4]]
983  ["keywords" => <UI_GENERIC_CORPORATION> [WStr]]
984  ["url" => <http://wiki.eveonline.com/wiki/Alliance_System> [WStr]]
985  ["description" => <The Alliance System> [WStr]]
986  ["published" => <0> [Bool]]
987  ["tutorialID" => <0> [I4]]
988  [PyPackedRow 9 bytes]
989  ["contextID" => <116> [I4]]
990  ["keywords" => <UI_GENERIC_CORPORATION> [WStr]]
991  ["url" => <http://wiki.eveonline.com/wiki/Corporation_management_guide#Benefits_of_Corporate_Membership> [WStr]]
992  ["description" => <Benefits of belonging to a corporation?> [WStr]]
993  ["published" => <0> [Bool]]
994  ["tutorialID" => <0> [I4]]
995  [PyPackedRow 9 bytes]
996  ["contextID" => <117> [I4]]
997  ["keywords" => <UI_GENERIC_CORPORATION> [WStr]]
998  ["url" => <http://wiki.eveonline.com/wiki/Joining_a_corporation> [WStr]]
999  ["description" => <Joining NPC corporations> [WStr]]
1000  ["published" => <0> [Bool]]
1001  ["tutorialID" => <0> [I4]]
1002  [PyPackedRow 9 bytes]
1003  ["contextID" => <118> [I4]]
1004  ["keywords" => <UI_GENERIC_CORPORATION> [WStr]]
1005  ["url" => <http://wiki.eveonline.com/wiki/Corporation_wars> [WStr]]
1006  ["description" => <Corporation wars> [WStr]]
1007  ["published" => <0> [Bool]]
1008  ["tutorialID" => <0> [I4]]
1009  [PyPackedRow 9 bytes]
1010  ["contextID" => <119> [I4]]
1011  ["keywords" => <UI_GENERIC_CORPORATION> [WStr]]
1012  ["url" => <http://wiki.eveonline.com/wiki/Shareholders> [WStr]]
1013  ["description" => <Shareholders> [WStr]]
1014  ["published" => <0> [Bool]]
1015  ["tutorialID" => <0> [I4]]
1016  [PyPackedRow 9 bytes]
1017  ["contextID" => <120> [I4]]
1018  ["keywords" => <UI_GENERIC_CORPORATION> [WStr]]
1019  ["url" => <http://wiki.eveonline.com/wiki/Creating_a_corporation> [WStr]]
1020  ["description" => <Creating a corporation> [WStr]]
1021  ["published" => <0> [Bool]]
1022  ["tutorialID" => <0> [I4]]
1023  [PyPackedRow 9 bytes]
1024  ["contextID" => <121> [I4]]
1025  ["keywords" => <UI_GENERIC_CORPORATION> [WStr]]
1026  ["url" => <http://wiki.eveonline.com/wiki/Corp_theft> [WStr]]
1027  ["description" => <Corp theft> [WStr]]
1028  ["published" => <0> [Bool]]
1029  ["tutorialID" => <0> [I4]]
1030  [PyPackedRow 9 bytes]
1031  ["contextID" => <122> [I4]]
1032  ["keywords" => <UI_GENERIC_CORPORATION> [WStr]]
1033  ["url" => <http://wiki.eveonline.com/wiki/Sovereignty_(Mechanics)> [WStr]]
1034  ["description" => <Sovereignty> [WStr]]
1035  ["published" => <0> [Bool]]
1036  ["tutorialID" => <0> [I4]]
1037  [PyPackedRow 9 bytes]
1038  ["contextID" => <123> [I4]]
1039  ["keywords" => <UI_STATION_INSURANCE> [WStr]]
1040  ["url" => <empty string> [WStr]]
1041  ["description" => <empty string> [WStr]]
1042  ["published" => <0> [Bool]]
1043  ["tutorialID" => <41> [I4]]
1044  [PyPackedRow 9 bytes]
1045  ["contextID" => <124> [I4]]
1046  ["keywords" => <UI_STATION_MEDICAL> [WStr]]
1047  ["url" => <empty string> [WStr]]
1048  ["description" => <empty string> [WStr]]
1049  ["published" => <0> [Bool]]
1050  ["tutorialID" => <42> [I4]]
1051  [PyPackedRow 9 bytes]
1052  ["contextID" => <125> [I4]]
1053  ["keywords" => <UI_STATION_MILITIAOFFICE> [WStr]]
1054  ["url" => <http://wiki.eveonline.com/wiki/Factional_Warfare> [WStr]]
1055  ["description" => <Factional Warfare> [WStr]]
1056  ["published" => <0> [Bool]]
1057  ["tutorialID" => <0> [I4]]
1058  [PyPackedRow 9 bytes]
1059  ["contextID" => <126> [I4]]
1060  ["keywords" => <UI_GANG_FLEET> [WStr]]
1061  ["url" => <http://wiki.eveonline.com/wiki/EVE_voice> [WStr]]
1062  ["description" => <EVE Voice - How to use> [WStr]]
1063  ["published" => <0> [Bool]]
1064  ["tutorialID" => <0> [I4]]
1065  [PyPackedRow 9 bytes]
1066  ["contextID" => <127> [I4]]
1067  ["keywords" => <UI_SHARED_CERTPLANNER> [WStr]]
1068  ["url" => <http://wiki.eveonline.com/wiki/Certificates> [WStr]]
1069  ["description" => <Certificates> [WStr]]
1070  ["published" => <0> [Bool]]
1071  ["tutorialID" => <134> [I4]]
1072  [PyPackedRow 9 bytes]
1073  ["contextID" => <128> [I4]]
1074  ["keywords" => <UI_SHARED_CHARACTERSHEET> [WStr]]
1075  ["url" => <http://wiki.eveonline.com/wiki/Kill_Rights> [WStr]]
1076  ["description" => <Kill Rights> [WStr]]
1077  ["published" => <0> [Bool]]
1078  ["tutorialID" => <0> [I4]]
1079  [PyPackedRow 9 bytes]
1080  ["contextID" => <129> [I4]]
1081  ["keywords" => <UI_FLEET_FLEET> [WStr]]
1082  ["url" => <http://wiki.eveonline.com/wiki/Fleet> [WStr]]
1083  ["description" => <Fleets> [WStr]]
1084  ["published" => <0> [Bool]]
1085  ["tutorialID" => <0> [I4]]
1086  [PyPackedRow 9 bytes]
1087  ["contextID" => <130> [I4]]
1088  ["keywords" => <UI_SHARED_CHANNELS> [WStr]]
1089  ["url" => <http://wiki.eveonline.com/wiki/Channels> [WStr]]
1090  ["description" => <Channels> [WStr]]
1091  ["published" => <0> [Bool]]
1092  ["tutorialID" => <0> [I4]]
1093  [PyPackedRow 9 bytes]
1094  ["contextID" => <131> [I4]]
1095  ["keywords" => <SOVEREIGNTY_SOVEREIGNTYDASHBOARD> [WStr]]
1096  ["url" => <http://wiki.eveonline.com/wiki/Sovereignty_dashboard> [WStr]]
1097  ["description" => <Sovereignty Dashboard> [WStr]]
1098  ["published" => <0> [Bool]]
1099  ["tutorialID" => <0> [I4]]
1100  [PyPackedRow 9 bytes]
1101  ["contextID" => <132> [I4]]
1102  ["keywords" => <UI_FLEET_FLEET> [WStr]]
1103  ["url" => <http://wiki.eveonline.com/wiki/EVE_voice> [WStr]]
1104  ["description" => <EVE Voice> [WStr]]
1105  ["published" => <0> [Bool]]
1106  ["tutorialID" => <0> [I4]]
1107  [PyPackedRow 9 bytes]
1108  ["contextID" => <133> [I4]]
1109  ["keywords" => <SOVEREIGNTY_SOVEREIGNTYDASHBOARD> [WStr]]
1110  ["url" => <http://wiki.eveonline.com/wiki/Sovereignty_(Mechanics)> [WStr]]
1111  ["description" => <Sovereignty> [WStr]]
1112  ["published" => <0> [Bool]]
1113  ["tutorialID" => <0> [I4]]
1114  [PyPackedRow 9 bytes]
1115  ["contextID" => <134> [I4]]
1116  ["keywords" => <UI_CAL_CALENDAR> [WStr]]
1117  ["url" => <http://wiki.eveonline.com/en/wiki/calendar> [WStr]]
1118  ["description" => <the calendar> [WStr]]
1119  ["published" => <0> [Bool]]
1120  ["tutorialID" => <0> [I4]]
1121  [PyNone]
1122 */
1123 }
1124 
1125 //00:25:53 L TutorialService::Handle_GetCharacterTutorialState(): size= 0
1126 PyResult TutorialService::Handle_GetCharacterTutorialState( PyCallArgs& call ) {
1127  /* Empty Call */
1128 
1129  return new PyInt( 0 );
1130 }
1131 
1132 PyResult TutorialService::Handle_GetTutorialsAndConnections( PyCallArgs& call ) {
1133  /* no logs */
1134  /* This is used to link tutorials using connections to other tutorials */
1135  /*
1136  t, tc = sm.RemoteSvc('tutorialSvc').GetTutorialsAndConnections()
1137  self.tutorials = t.Index('tutorialID')
1138  tc = tc.Filter('tutorialID')
1139  self.tutorialConnections = defaultdict(dict)
1140  for tutID, rows in tc.iteritems():
1141  for each in rows:
1142  self.tutorialConnections[tutID][each.raceID] = each.nextTutorialID
1143  */
1144 
1145  /* FIXME this needs work. not sure what's wrong, but i DO know our db is incomplete
1146  uint8 raceID = call.client->GetChar()->race();
1147  return (m_db.GetTutorialsAndConnections(raceID));
1148  */
1149  return PyStatic.NewNone();
1150 }
1151 
1152 PyResult TutorialService::Handle_GetCareerAgents( PyCallArgs& call ) {
1153  /* Empty Call */
1169  return PyStatic.NewNone();
1170 }
1171 
1172 
Dispatcher *const m_dispatch
virtual ~TutorialService()
PyRep * GetPages(uint32 tutorialID)
Definition: TutorialDB.cpp:46
size_t size() const
Definition: PyRep.h:591
Dispatcher *const m_dispatch
PyRep * GetAllCriterias()
Definition: TutorialDB.cpp:107
const char * GetName() const
Definition: PyService.h:54
* args
#define sLog
Evaluates to a NewLog instance.
Definition: LogNew.h:250
#define codelog(type, fmt,...)
Definition: logsys.h:128
Python integer.
Definition: PyRep.h:231
PyRep * GetPageCriterias(uint32 tutorialID)
Definition: TutorialDB.cpp:30
#define PyStatic
Definition: PyRep.h:1209
PyRep * GetTutorial(uint32 tutorialID)
Definition: TutorialDB.cpp:62
PyCallable_Make_InnerDispatcher(TutorialService) TutorialService
#define PyCallable_REG_CALL(c, m)
Definition: PyServiceCD.h:78
PyRep * GetTutorialCriterias(uint32 tutorialID)
Definition: TutorialDB.cpp:77
PyRep * GetAllTutorials()
Definition: TutorialDB.cpp:92
void Dump(LogType type) const
Definition: PyCallable.cpp:81
PyRep * GetCategories()
Definition: TutorialDB.cpp:121
PyTuple * tuple
Definition: PyCallable.h:50