Welcome to mirror list, hosted at ThFree Co, Russian Federation.

muc.py « plugins - github.com/isida/4.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 360956f3202bee7efa6a86d28162e95b6c82aa2b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
#!/usr/bin/python
# -*- coding: utf-8 -*-

# --------------------------------------------------------------------------- #
#                                                                             #
#    Plugin for iSida Jabber Bot                                              #
#    Copyright (C) diSabler <dsy@dsy.name>                                    #
#                                                                             #
#    This program is free software: you can redistribute it and/or modify     #
#    it under the terms of the GNU General Public License as published by     #
#    the Free Software Foundation, either version 3 of the License, or        #
#    (at your option) any later version.                                      #
#                                                                             #
#    This program is distributed in the hope that it will be useful,          #
#    but WITHOUT ANY WARRANTY; without even the implied warranty of           #
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            #
#    GNU General Public License for more details.                             #
#                                                                             #
#    You should have received a copy of the GNU General Public License        #
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.    #
#                                                                             #
# --------------------------------------------------------------------------- #

visitors_list = {}
visitors_list_lock = False

# -------------- affiliation -----------------

def global_ban(type, jid, nick, text):
	text = text.lower()
	hroom = getRoom(jid)
	al = get_level(jid,nick)[0]
	if al == 9: af = 'owner'
	else: af = get_affiliation(jid,nick)
	if af != 'owner': msg = L('This command available only for conference owner!','%s/%s'%(jid,nick))
	elif text == 'show' and al == 9:
		ir = cur_execute_fetchone('select * from ignore_ban;')
		if len(ir): msg = '%s\n%s' % (L('Global ban is off in:','%s/%s'%(jid,nick)),'\n'.join([t[0] for t in ir]))
		else: msg = L('Global ban enable without limits!','%s/%s'%(jid,nick))
	elif text == 'del' and af == 'owner':
		if cur_execute_fetchone('select * from ignore_ban where room=%s' % (hroom,)): msg = L('Conference %s already deleted from global ban list!','%s/%s'%(jid,nick)) % hroom
		else:
			cur_execute('insert inro ignore_ban values (%s)' % (hroom,))
			msg = L('Conference %s has been deleted from global ban list!','%s/%s'%(jid,nick)) % hroom
	elif text == 'add' and af == 'owner':
		if cur_execute_fetchone('select * from ignore_ban where room=%s' % (hroom,)):
			cur_execute('delete from ignore_ban where room=%s' % (hroom,))
			msg = L('Conference %s has been added from global ban list!','%s/%s'%(jid,nick)) % hroom
		else: msg = L('Conference %s already exist in global ban list!','%s/%s'%(jid,nick)) % hroom
	else:
		if al == 9:
			if cur_execute_fetchone('select * from ignore_ban where room=%s' % (hroom,)): msg = L('Your conference will be ignored for global ban!','%s/%s'%(jid,nick))
			elif '@' not in text or '.' not in text: msg = L('I need jid!','%s/%s'%(jid,nick))
			else:
				reason = L('banned global by %s from %s','%s/%s'%(jid,nick)) % (nick, jid)
				br = [t[0] for t in cur_execute_fetchall("select room from conference where split_part(room,'/',1) not in (select room from ignore_ban as igb);")]
				for tmp in br:
					i = xmpp.Node('iq', {'id': get_id(), 'type': 'set', 'to':getRoom(tmp)}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':'outcast', 'jid':unicode(text)},[xmpp.Node('reason',{},reason)])])])
					sender(i)
					time.sleep(0.1)
				msg = L('jid %s has been banned in %s conferences.','%s/%s'%(jid,nick)) % (text, len(br))
		else: msg = L('Command temporary blocked!','%s/%s'%(jid,nick))
	send_msg(type, jid, nick, msg)

def muc_tempo_ban(type, jid, nick, text):
	text,mute = text.strip().split('\n'),False
	if text:
		cmd, par = text[0].lower().split(' ',1) if ' ' in text[0] else (text[0].lower().split(' ',1)[0],'')
		if cmd == 'show':
			if not par: par = '%'
			tb = cur_execute_fetchall('select jid,time from tmp_ban where room=%s and jid ilike %s',(jid,par))
			if tb: msg = L('Found: %s','%s/%s'%(jid,nick)) % '\n%s' % '\n'.join([['%s\t%s' % (ub[0],un_unix(ub[1]-int(time.time()),'%s/%s'%(jid,nick))),'%s\t< %s' % (ub[0],un_unix(GT('schedule_time'),'%s/%s'%(jid,nick)))][ub[1] < int(time.time())] for ub in tb])
			else: msg = L('Not found.','%s/%s'%(jid,nick))

		elif cmd == 'del':
			if par:
				tb = cur_execute_fetchall('select jid,time from tmp_ban where room=%s and jid ilike %s',(jid,par))
				if tb:
					msg = L('Removed: %s','%s/%s'%(jid,nick)) % '\n%s' % '\n'.join([['%s\t%s' % (ub[0],un_unix(ub[1]-int(time.time()),'%s/%s'%(jid,nick))),'%s\t< %s' % (ub[0],un_unix(GT('schedule_time'),'%s/%s'%(jid,nick)))][ub[1] < int(time.time())] for ub in tb])
					for ub in tb: sender(xmpp.Node('iq', {'id': get_id(), 'type': 'set', 'to':jid}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':'none', 'jid':getRoom(unicode(ub[0]))},[])])]))
					cur_execute('delete from tmp_ban where room=%s and jid ilike %s',(jid,par))
				else: msg = L('Not found.','%s/%s'%(jid,nick))
			else: msg = L('What?','%s/%s'%(jid,nick))

		else:
			try: ban_time = int(text[1][:-1]) * {'s':1, 'm':60, 'h':3600, 'd':86400}[text[1][-1].lower()]
			except: ban_time = None
			if ban_time:
				reason = ' '.join(text[2:])
				if not reason: reason = L('No reason!','%s/%s'%(jid,nick))
				reason = L('ban on %s since %s because: %s','%s/%s'%(jid,nick)) % (un_unix(ban_time,'%s/%s'%(jid,nick)), timeadd(tuple(time.localtime())), reason)
				who,msg = text[0],L('done','%s/%s'%(jid,nick))
				try: whojid = getRoom([t[4] for t in megabase if t[0]==jid and t[1]==who][0])
				except: whojid = None
				if not whojid:
					fnd = cur_execute_fetchall('select jid from age where room=%s and (nick=%s or jid=%s) group by jid',(jid,who,who))
					if len(fnd) == 1: whojid = getRoom(fnd[0][0])
					elif len(fnd) > 1: msg = L('I seen different people with this nick!','%s/%s'%(jid,nick))
					else: msg,whojid = L('I don\'n know %s, and use as is!','%s/%s'%(jid,nick)) % who,who
				if whojid:
					sender(xmpp.Node('iq', {'id': get_id(), 'type': 'set', 'to':jid}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':'outcast', 'jid':unicode(whojid)},[xmpp.Node('reason',{},reason)])])]))
					was_banned = cur_execute_fetchone('select time from tmp_ban where room=%s and jid=%s;',(jid,whojid))
					if was_banned:
						cur_execute('delete from tmp_ban where room=%s and jid=%s;',(jid,whojid))
						ban_tm = was_banned[0]-int(time.time())
						if ban_tm > 0: ban_nm = L('old ban time is %s','%s/%s'%(jid,nick)) % un_unix(ban_tm,'%s/%s'%(jid,nick))
						else: ban_nm = L('just passed!','%s/%s'%(jid,nick))
						msg = L('Updated: %s','%s/%s'%(jid,nick)) % ban_nm
					cur_execute('insert into tmp_ban values (%s,%s,%s)',(jid,whojid,ban_time+int(time.time())))
				if who == nick: mute = True
			else: msg = L('Time format error!','%s/%s'%(jid,nick))
	else: msg = L('What?','%s/%s'%(jid,nick))

	if not mute: send_msg(type, jid, nick, msg)

def muc_ban(type, jid, nick,text): muc_affiliation(type, jid, nick, text, 'outcast',0)
def muc_banjid(type, jid, nick,text): muc_affiliation(type, jid, nick, text, 'outcast',1)
def muc_none(type, jid, nick,text): muc_affiliation(type, jid, nick, text, 'none',0)
def muc_nonejid(type, jid, nick,text): muc_affiliation(type, jid, nick, text, 'none',1)
def muc_member(type, jid, nick,text): muc_affiliation(type, jid, nick, text, 'member',0)
def muc_memberjid(type, jid, nick,text): muc_affiliation(type, jid, nick, text, 'member',1)

def muc_affiliation(type, jid, nick, text, aff, is_jid):
	nowname = get_xnick(jid)
	xtype = get_xtype(jid)
	if xtype == 'owner':
		if is_start: return
		else: send_msg(type, jid, nick, L('Command is locked!','%s/%s'%(jid,nick)))
	elif len(text):
		skip = None
		if '\n' in text: who, reason = text.split('\n',1)[0], text.split('\n',1)[1]
		else: who, reason = text, []
		if reason: reason = [xmpp.Node('reason',{},reason)]
		whojid = [unicode(get_level(jid,who)[1]),who][is_jid]
		if whojid != 'None': sender(xmpp.Node('iq', {'id': get_id(), 'type': 'set', 'to':jid}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':aff, 'jid':whojid},reason)])]))
		else: send_msg(type, jid, nick, L('I don\'t know %s','%s/%s'%(jid,nick)) % who)
	else: send_msg(type, jid, nick, L('What?','%s/%s'%(jid,nick)))

def muc_ban_past(type, jid, nick,text): muc_affiliation_past(type, jid, nick, text, 'outcast')
def muc_none_past(type, jid, nick,text): muc_affiliation_past(type, jid, nick, text, 'none')
def muc_member_past(type, jid, nick,text): muc_affiliation_past(type, jid, nick, text, 'member')

def muc_affiliation_past(type, jid, nick, text, aff):
	nowname = get_xnick(jid)
	xtype = get_xtype(jid)
	if xtype == 'owner':
		if is_start: return
		else: msg, text = L('Command is locked!','%s/%s'%(jid,nick)), ''
	else: msg = L('What?','%s/%s'%(jid,nick))
	if len(text):
		skip = None
		if '\n' in text: who, reason = text.split('\n',1)[0], text.split('\n',1)[1]
		else: who, reason = text, []
		if reason: reason = [xmpp.Node('reason',{},reason)]
		fnd = cur_execute_fetchall('select jid from age where room=%s and (nick=%s or jid=%s) group by jid',(jid,who,who))
		if len(fnd) == 1: msg, whojid = L('done','%s/%s'%(jid,nick)), getRoom(unicode(fnd[0][0]))
		elif len(fnd) > 1:
			whojid = getRoom(get_level(jid,who)[1])
			if whojid != 'None': msg = L('done','%s/%s'%(jid,nick))
			else: msg, skip = L('I seen some peoples with this nick. Get more info!','%s/%s'%(jid,nick)), True
		else:
			msg = L('I don\'n know %s, and use as is!','%s/%s'%(jid,nick)) % who
			whojid = who
	else: skip = True
	if skip: send_msg(type, jid, nick, msg)
	else:
		i = xmpp.Node('iq', {'id': get_id(), 'type': 'set', 'to':jid}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':aff, 'jid':unicode(whojid)},reason)])])
		sender(i)
		send_msg(type, jid, nick, msg)

def muc_kick(type, jid, nick, text): muc_role(type, jid, nick, text, 'none',1)
def muc_participant(type, jid, nick, text): muc_role(type, jid, nick, text, 'participant',1)
def muc_visitor(type, jid, nick, text): muc_role(type, jid, nick, text, 'visitor',1)
def muc_moderator(type, jid, nick, text): muc_role(type, jid, nick, text, 'moderator',1)

def muc_role(type, jid, nick, text, role, unused):
	nowname = get_xnick(jid)
	xtype = get_xtype(jid)
	if xtype == 'owner':
		if is_start: return
		else: send_msg(type, jid, nick, L('Command is locked!','%s/%s'%(jid,nick)))
	elif len(text):
		skip = None
		if '\n' in text: who, reason = text.split('\n',1)[0], text.split('\n',1)[1]
		else: who, reason = text, []
		if reason: reason = [xmpp.Node('reason',{},reason)]
		whojid = unicode(get_level(jid,who)[1])
		if whojid != 'None': sender(xmpp.Node('iq', {'id': get_id(), 'type': 'set', 'to':jid}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'role':role, 'nick':who},reason)])]))
		else: send_msg(type, jid, nick, L('I don\'t know %s','%s/%s'%(jid,nick)) % who)
	else: send_msg(type, jid, nick, L('What?','%s/%s'%(jid,nick)))

def check_unban():
	tt = int(time.time())
	ul = cur_execute_fetchall('select room,jid from tmp_ban where time<%s;',(tt,))
	if ul:
		for t in ul: sender(xmpp.Node('iq', {'id': get_id(), 'type': 'set', 'to':t[0]}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':'none', 'jid':getRoom(unicode(t[1]))},[])])]))
		cur_execute('delete from tmp_ban where time<%s;',(tt,))

def visitors_list_lock_wait():
	while visitors_list_lock: time.sleep(0.05)
	return True

def check_visitor():
	global visitors_list, visitors_list_lock
	visitors_list_lock = visitors_list_lock_wait()
	ITT = int(time.time())
	for t in visitors_list:
		room = t.split('/')[0]
		VISITOR_ACT = get_config(getRoom(room),'visitor_action')
		if VISITOR_ACT != 'off' and ITT > visitors_list[t]:
			reason = [xmpp.Node('reason',{},L('Too long was without voice!',t))]
			if VISITOR_ACT == 'kick': sender(xmpp.Node('iq', {'id': get_id(), 'type': 'set', 'to':room}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'role':'none', 'nick':t.split('/',1)[1]},reason)])]))
			else: sender(xmpp.Node('iq', {'id': get_id(), 'type': 'set', 'to':room}, payload = [xmpp.Node('query', {'xmlns': xmpp.NS_MUC_ADMIN},[xmpp.Node('item',{'affiliation':'outcast', 'jid':get_jid_by_nick(t.split('/',1))},reason)])]))
	visitors_list_lock = False

def visitor_presence(room,jid,nick,type,mass):
	global visitors_list, visitors_list_lock
	if getRoom(jid) == getRoom(Settings['jid']): return
	if type == 'error': return
	elif type == 'unavailable':
		visitors_list_lock = visitors_list_lock_wait()
		try: visitors_list.pop('%s/%s' % (room,nick))
		except: pass
		visitors_list_lock = False
	if mass[1] == 'visitor':
		visitors_list_lock = visitors_list_lock_wait()
		visitors_list['%s/%s' % (room,nick)] = int(time.time()) + get_config_int(getRoom(room),'visitor_action_time')	
		visitors_list_lock = False

global execute, timer, presence_control

timer = [check_unban,check_visitor]
presence_control = [visitor_presence]

execute = [(7, 'ban_past', muc_ban_past, 2, 'Ban user.'),
	   (7, 'ban', muc_ban, 2, 'Ban user.'),
	   (7, 'banjid', muc_banjid, 2, 'Ban user by jid.'),
	   (7, 'unban', muc_none, 2, 'Unban user.'),
	   (7, 'unbanjid', muc_nonejid, 2, 'Unban user by jid.'),
	   (7, 'tban', muc_tempo_ban, 2, 'Temporary ban.\ntban show|del [jid] - show/del temporary bans\ntban nick\ntimeD|H|M|S\nreason - ban nick for time because reason.'),
	   (7, 'none_past', muc_none_past, 2, 'Remove user affiliation.'),
	   (7, 'none', muc_none, 2, 'Remove user affiliation.'),
	   (7, 'nonejid', muc_nonejid, 2, 'Remove user affiliation.'),
	   (7, 'member_past', muc_member_past, 2, 'Get member affiliation.'),
	   (7, 'member', muc_member, 2, 'Get member affiliation.'),
	   (7, 'memberjid', muc_memberjid, 2, 'Get member affiliation.'),
	   (7, 'kick', muc_kick, 2, 'Kick user.'),
	   (7, 'participant', muc_participant, 2, 'Change role to participant.'),
	   (7, 'visitor', muc_visitor, 2, 'Revoke voice.'),
	   (7, 'moderator', muc_moderator, 2, 'Grant moderator.'),
	   (8, 'global_ban', global_ban, 2, 'Global ban. Available only for confernce owner.\nglobal_ban del - remove conference from banlist,\nglobal_ban add - add conference into banlist,\nglobal_ban <jid> - ban jid in all rooms, where bot is admin.')]