blob: e1b3f7f495b3b7d8b1a40da79bc54d4fc8479a45 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001
2#pragma strict_types,save_types
3#pragma no_clone,no_shadow
4
5#include <daemon.h>
6#include <logging.h>
7
8static int d_start, d_end, e_start, e_end;
9
10protected void create()
11{
12 d_end = d_start = e_end = e_start = file_size(__DEBUG_LOG__);
13}
14
15int check( string ch, object pl, string cmd, string txt )
16{
17 mixed tmp;
18
19 if ( ch != "Debug" && ch != "Entwicklung" && ch != "Warnungen" )
20 return 0;
21
22 if( objectp(pl) && query_once_interactive(pl) && query_wiz_level(pl) > 15 )
23 switch(cmd){
24 case C_FIND:
25 case C_LIST:
26 case C_JOIN:
27 case C_LEAVE:
28 return 1;
29 case C_SEND:
30 // Wer (noch) nicht auf dem Kanal ist, bekommt auch keine
31 // Ausgabe - sonst gibt es selbige doppelt, da der CHMASTER
32 // einen automatisch den Kanal betreten laesst ...
33 if ( !objectp(pl) || !pointerp(tmp=(mixed)pl->QueryProp(P_CHANNELS)) ||
34 member( tmp, lower_case(ch) ) == -1 )
35 return 1;
36
37 switch( lower_case(txt) ){
38 case "backtrace":
39 {
40 string bt, log;
41 int start, end;
42
43 if ( ch == "Debug" ) {
44 start = d_start;
45 end = d_end;
46 }
47 else if (ch == "Entwicklung") {
48 start = e_start;
49 end = e_end;
50 }
51 else if (ch == "Warnungen") {
52 pl->Message( "[" + ch + ":] Backtrace fuer Warnungen "
53 "nicht verfuegbar!\n");
54 return 0;
55 }
56 else return(1);
57
58 if( start >= end )
59 bt = "[" + ch + ":] Kein Backtrace verfuegbar!\n";
60 else {
Zesstraedeb2262019-11-04 23:47:23 +010061 log = regreplace(
62 to_text(read_bytes( __DEBUG_LOG__, start,
63 min(end-start, 10000)),
64 "UTF-8")
65 || "\nFehler beim Einlesen des Debuglogs: "
66 "Kein Backtrace verfuegbar!\n",
67 "(Misplaced|current_object|"
68 "Connection|Host)[^\n]*\n",
69 "", 1 );
MG Mud User88f12472016-06-24 23:31:02 +020070 bt = "[" + ch + ":] -- BACKTRACE BEGIN --\n"
71 + log
72 + "[" + ch + ":] -- BACKTRACE END --\n";
73 }
Zesstraedeb2262019-11-04 23:47:23 +010074
MG Mud User88f12472016-06-24 23:31:02 +020075 call_out( symbol_function( "Message", pl ), 0, bt );
76 }
77 break;
78
79 default:
80 if ( ch != "Warnungen" ) {
81 pl->Message( "[" + ch + ":] Hilfe...\n"
82 "[" + ch + ":] Folgende Kommandos stehen zur "
83 "Verfuegung:\n"
84 "[" + ch + ":] 'backtrace' -- sendet den "
85 "Backtrace zum Fehler\n"
86 "[" + ch + ":] 'hilfe' -- sendet diese "
87 "Hilfeseite\n");
88 }
89 else {
90 pl->Message( "[" + ch + ":] Keine Kommandos verfuegbar!\n");
91 }
92 }
93 }
94
95 return 0;
96}
97
98string name() { return "<Debugger>"; }
99string Name() { return "<Debugger>"; }
100
101void ChannelMessage( mixed a )
102{
103 int fs;
104
105 fs = file_size(__DEBUG_LOG__);
106
107 switch( a[0] ){
108 case "Debug":
109 if ( fs > d_end && fs > e_end ){
110 d_start = max((d_end > e_end ? d_end : e_end),0);
111 d_end = fs;
112 }
113 else if (fs < d_start || fs <= d_end) {
114 // Debuglog wurde wohl neu geoeffnet.
115 d_start = d_end = e_start = e_end = fs;
116 }
117 break;
118
119 case "Entwicklung":
120 if ( fs > d_end && fs > e_end ){
121 e_start = max((e_end > d_end ? e_end : d_end),0);
122 e_end = fs;
123 }
124 else if (fs < e_start || fs <= e_end) {
125 // Debuglog wurde wohl neu geoeffnet.
126 d_start = d_end = e_start = e_end = fs;
127 }
128 break;
129 }
130}
131