· 9 years ago · Dec 12, 2016, 03:26 PM
1from os import walk
2import xchat
3import sqlite3
4import time
5import codecs
6from platform import system
7from subprocess import call
8from tempfile import NamedTemporaryFile
9
10__module_name__ = "Logs"
11__module_version__ = "1.0"
12__module_description__ = "Guarda tus logs en sqlite y realiza busquedas"
13
14xchat.emit_print("Channel Message", __module_name__, "Cargado.")
15
16events = {}
17os = system()
18
19if os == "Windows":
20 from os import startfile
21
22logpath = xchat.get_info("configdir")
23db = False
24hooks = {}
25
26conn = sqlite3.connect(logpath + "\logs.db")
27conn.text_factory = str
28cur = conn.cursor()
29
30cur.execute( '''
31CREATE TABLE if not exists logs (
32 server TEXT NOT NULL,
33 chan CHAR(64) NOT NULL,
34 data TEXT NOT NULL,
35 date TEXT NOT NULL)''')
36
37cur.execute('''
38CREATE TABLE if not exists `events` (
39 `JOIN` INTEGER DEFAULT 1,
40 `PART` INTEGER DEFAULT 1,
41 `PRIVMSG` INTEGER DEFAULT 1,
42 `NOTICE` INTEGER DEFAULT 1,
43 `KICK` INTEGER DEFAULT 1,
44 `MODE` INTEGER DEFAULT 1,
45 `TOPIC` INTEGER DEFAULT 1,
46 `QUIT` INTEGER DEFAULT 1,
47 `ADDDATE` INTEGER DEFAULT 1,
48 `NICK` INTEGER DEFAULT 1
49)''')
50
51if not cur.execute("SELECT 'JOIN' FROM events").fetchone():
52 cur.execute("INSERT INTO `events` DEFAULT VALUES")
53
54conn.commit()
55
56def updateEvents():
57 global events
58
59 sql = cur.execute("SELECT * FROM events").fetchone()
60
61 events["JOIN"] = str(sql[0])
62 events["PART"] = str(sql[1])
63 events["PRIVMSG"] = str(sql[2])
64 events["NOTICE"] = str(sql[3])
65 events["KICK"] = str(sql[4])
66 events["MODE"] = str(sql[5])
67 events["TOPIC"] = str(sql[6])
68 events["QUIT"] = str(sql[7])
69 events["ADDDATE"] = str(sql[8])
70 events["NICK"] = str(sql[9])
71
72 return
73
74updateEvents()
75
76def Events_cb(word, word_eol, userdata):
77 """
78 Registra a sql los eventos que esten activados
79 """
80 network = xchat.get_info("network")
81 chan = word[2].lstrip(":")
82 data = ' '.join(word[0:]).lstrip(":")
83 date = time.ctime()
84
85 if not chan.startswith("#"):
86 chan = "%"
87
88 cur.execute('''INSERT INTO logs VALUES (?, ?, ?, ?)''', (network, chan, data, date))
89 conn.commit()
90
91 return xchat.EAT_NONE
92
93def Logconf_cb(word, word_eol, userdata):
94 updateEvents()
95 global hooks
96
97 if len(word) == 1:
98 for e in events:
99 xchat.emit_print("Channel Message", __module_name__, e + " = " + events[e])
100 elif len(word) == 2:
101 val = word[1].upper()
102 if val in events:
103 xchat.emit_print("Channel Message", __module_name__,
104 word[1] + " = " + events[val])
105 elif val.lower() == "log2sql":
106 date = time.ctime()
107 i = 0
108 path = logpath + "/logs/"
109
110 for (dir, ficheros, channels) in walk(path):
111 network = dir.split("/")[-1]
112 path = dir + "/"
113 for chan in channels:
114 logFile = path + chan
115 log = codecs.open(logFile, 'rb', encoding='utf-8')
116 for logLine in log:
117 data = logLine.rstrip("\n")
118 cur.execute('''INSERT INTO logs VALUES (?, ?, ?, ?)''',
119 (network, chan.rstrip(".log"), data, date))
120 i += 1
121 log.close()
122 conn.commit()
123 xchat.emit_print("Channel Message", __module_name__, "%i registros exportados a SQL" % i)
124 else:
125 xchat.emit_print("Channel Message", __module_name__, word[1] + \
126 " No se encontro, eventos permitidos: %s" % ', '.join(events))
127 return xchat.EAT_XCHAT
128 else:
129 val = word[1].upper()
130 if not word[2].isdigit() or not word[2] in ("0", "1"):
131 xchat.emit_print("Channel Message", __module_name__,
132 " Valores validos: 0 (deshabilitado) o 1 (habilitado)")
133 return xchat.EAT_XCHAT
134
135 if val in events:
136 cur.execute("UPDATE events SET '%s'=%s" % (val, int(word[2])))
137 conn.commit()
138 xchat.emit_print("Channel Message", __module_name__, word[1] + "Valor guardado.")
139 events[val] = word[2]
140
141 if val == "ADDDATE":
142 return xchat.EAT_XCHAT
143
144 if word[2] == "1":
145 hooks[val] = xchat.hook_server(val, Events_cb)
146 else:
147 xchat.unhook(hooks[val])
148 hooks[val] = None
149 else:
150 xchat.emit_print("Channel Message", __module_name__, word[1] + \
151 " No se encontro, eventos permitidos: %s" % ', '.join(events))
152 return xchat.EAT_XCHAT
153
154 return xchat.EAT_XCHAT
155
156def Log_cb(word, word_eol, userdata):
157 chan = xchat.get_info("channel")
158 network = xchat.get_info("network")
159
160 if len(word) == 1:
161 word.append("%")
162
163 pattern = "%" + ' '.join(word[1:]) + "%"
164
165 if events["ADDDATE"] == "1":
166 sql = cur.execute("SELECT date, data FROM logs WHERE (chan=? OR chan='%') AND server=? AND data LIKE ?",
167 (chan, network, pattern))
168 else:
169 sql = cur.execute("SELECT data FROM logs WHERE (chan=? OR chan='%') AND server=? AND data LIKE ?",
170 (chan, network, pattern))
171 res = sql.fetchall()
172
173 if len(res) < 1:
174 xchat.emit_print("Channel Message", __module_name__, "Ninguna coincidencias para \002%s\002 en %s" %
175 (pattern, chan))
176 else:
177 ftmp = NamedTemporaryFile(delete=False, suffix=".txt")
178 fname = ftmp.name
179
180 xchat.emit_print("Channel Message", __module_name__, " ")
181 for line in res:
182
183 if events["ADDDATE"] == "1":
184 out = line[1]
185 data = line[1].split()
186 else:
187 out = line[0]
188 data = line[0].split()
189
190 if len(data) > 1 and "PRIVMSG" == data[1]:
191 nick = data[0].split("!")[0]
192 msg = ' '.join(data[3:]).lstrip(":")
193 out = "<" + nick + '> ' + msg
194
195 if events["ADDDATE"] == "1":
196 out = "[" + line[0] + "] " + out
197
198 ftmp.write(out + "\n")
199
200 if os == "Windows":
201 startfile(fname)
202 else:
203 call(('xdg-open', fname))
204
205 ftmp.close()
206
207 return xchat.EAT_XCHAT
208
209def unload_cb(userdata):
210 conn.commit()
211 conn.close()
212 xchat.emit_print("Channel Message", __module_name__, "Descargado.")
213
214xchat.hook_command("LOG", Log_cb)
215xchat.hook_command("LOGSCONF", Logconf_cb)
216xchat.hook_unload(unload_cb)
217
218for event in events:
219 if event == "ADDDATE":
220 continue
221 if events[event] == "1":
222 hooks[event] = xchat.hook_server(event, Events_cb)