-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsetutax.py
310 lines (273 loc) · 11.2 KB
/
setutax.py
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
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
# Under GPL-3.0 License
import random
import asyncio
import os
import sqlite3
import re
import shutil
from datetime import datetime,timedelta
from hoshino import R,util,priv
from hoshino import Service
from hoshino.typing import CQEvent
from hoshino.util import concat_pic, pic2b64,fig2b64, FreqLimiter, DailyNumberLimiter
from .setudao import SetuDao,SetuLikeLogDao
sv = Service('setutax', help_='''一起实现群色图自由吧!
'''.strip(),enable_on_default=False)
_flmt = FreqLimiter(10)
GO_CQHTTP_PATH = 'D:/BOT/Go/'
RE_CQIMG = r"\[CQ:image,file=(?P<file>[^,\[\]]*?),url=(?P<url>[^,\[\]]*?)\]"
TAX_TIMEOUT = 60
class TaxMaster:
def __init__(self):
self.taxing = {}
def is_taxing(self, gid ,uid):
return f'g{gid}u{uid}' in self.taxing
def start_tax(self, gid ,uid):
return Tax(gid, uid, self)
def get_tax(self, gid,uid):
return self.taxing[f'g{gid}u{uid}'] if f'g{gid}u{uid}' in self.taxing else None
class Tax:
def __init__(self, gid,uid,tax_master):
self.gid = gid
self.uid = uid
self.tm = tax_master
self.timeout = datetime.now()+timedelta(seconds=TAX_TIMEOUT)
self.ct = 0
def __enter__(self):
self.tm.taxing[f'g{self.gid}u{self.uid}'] = self
return self
def __exit__(self, type_, value, trace):
del self.tm.taxing[f'g{self.gid}u{self.uid}']
def record(self,filename):
dao = SetuDao()
dao.add(self.gid,self.uid,filename)
tm = TaxMaster()
@sv.on_fullmatch(('缴色图税','交色图税'))
async def start_tax(bot, ev: CQEvent):
if tm.is_taxing(ev.group_id,ev.user_id):
await bot.finish(ev, "已经开启了上传通道,请直接发送图片,在此期间内无法执行其他BOT命令")
with tm.start_tax(ev.group_id,ev.user_id) as tax:
await bot.send(ev, f"色图上传通道已开启,请直接发送图片到群。不要发送动图、超过3mb的图、违规图。如果是合并转发的消息,请保证消息只有一层嵌套。{TAX_TIMEOUT}秒内没收到新图片会自动关闭通道。\n一起实现群色图自由吧!")
#循环判断是否结束,20秒判定一次,最多5分钟也就是15次后也会关闭
ct = 0
while datetime.now() < tax.timeout and ct<15:
await asyncio.sleep(20)
ct+=1
await bot.send(ev, f"上传通道已关闭,共收到图片:{tax.ct}张")
@sv.on_message()
async def on_rcv_setu(bot, ev: CQEvent):
tax = tm.get_tax(ev.group_id,ev.user_id)
if not tax:
return
content = str(ev.message)
path = R.img(f'setutax/{ev.group_id}/').path
if not os.path.exists(path):
os.makedirs(R.img(f'setutax/{ev.group_id}/').path)
#判断是不是合并转发
fwid = ''
for m in ev.message:
if m["type"] =="forward":
fwid=m["data"]["id"]
break
if fwid !='':
mm = await bot.get_forward_msg(message_id=fwid)
ct = 0
err = 0
if 'messages' in mm:
for msg in mm["messages"]:
content = msg["content"]
match = re.findall(RE_CQIMG,content)
if match:
for m in match:
try:
cachefile = await bot.get_image(file=m[0])
if type(cachefile) == dict:
fname = cachefile["file"]
fname = fname[fname.rfind('/')+1:]
size = cachefile["size"]
if size <= 3145728:
shutil.move(GO_CQHTTP_PATH+cachefile["file"], path)
ct += 1
tax.record(fname)
else:
#文件过大,删掉缓存
largepic+=1
else:
err += 1
except:
err += 0
tax.ct +=ct
await bot.send(ev,f"收到合并转发的图片,下载成功{ct}张,下载失败{err}张")
else:
ct = 0
err = 0
largepic = 0
match = re.findall(RE_CQIMG,content)
if match:
for m in match:
try:
cachefile = await bot.get_image(file=m[0])
if type(cachefile) == dict:
fname = cachefile["file"]
fname = fname[fname.rfind('/')+1:]
size = cachefile["size"]
if size <= 3145728:
shutil.move(GO_CQHTTP_PATH+cachefile["file"], path)
ct += 1
tax.record(fname)
else:
#文件过大,删掉缓存
largepic+=1
else:
err += 1
except:
err += 1
tax.ct +=ct
tax.timeout = datetime.now()+timedelta(seconds=TAX_TIMEOUT)
str2 = '' if largepic==0 else f',{largepic}张超大图片未保存'
await bot.send(ev, f"收到图片:{ct}张{str2}")
@sv.on_command('groupsetu',aliases=('群色图'),deny_tip='服务未开启', only_to_me=False)
async def groupsetu(session):
uid = session.ctx['user_id']
gid = session.ctx['group_id']
qq = session.current_arg
aa = qq.find('[CQ:at,qq=')
if aa<0:
qq=0
else:
qq = int(qq[aa+10:qq.find(']',aa+10)])
if not _flmt.check(uid):
await session.send('您冲得太快了,请稍候再冲', at_sender=True)
return
_flmt.start_cd(uid)
dao = SetuDao()
setu = dao.get_setu(gid=gid,uid=qq)
if setu:
s = random.choice(setu)
dao.count_increase(s['id'])
fname = s['fname']
msg = []
msg.append(f"ID:{s['id']}")
msg.append(f"上传人:{s['uid']}")
msg.append(f"赞:{s['lk']},踩:{s['unlk']}")
msg.append(f"{R.img(f'setutax/{gid}/{fname}').cqcode}")
msg.append(f"不喜欢或者违规的图请使用命令【删图 id】来删除")
await session.send('\n'.join(msg))
else:
await session.send(f"色图库内没有本群的色图记录", at_sender=True)
@sv.on_prefix(('r18', '标记r18'))
async def set_tag(bot, ev: CQEvent):
msg = ev.message.extract_plain_text()
if not re.match(r"^[0-9]*$", msg):
bot.finish(ev, '格式为:r18空格色图id,例如r18 12', at_sender=True)
return
setuid = int(msg)
dao = SetuDao()
r = dao.add_tags(setuid,'r18',ev.group_id)
if r:
await bot.send(ev, f'标记成功', at_sender=True)
else:
await bot.send(ev, f'标记失败,色图id不正确', at_sender=True)
@sv.on_prefix(('删图', '删色图'))
async def delete_setu(bot, ev: CQEvent):
msg = ev.message.extract_plain_text()
if not re.match(r"^[0-9]*$", msg):
bot.finish(ev, '格式为:删图空格色图id,例如删图 12', at_sender=True)
return
setuid = int(msg)
dao = SetuDao()
r = dao.delete(ev.group_id,setuid)
if r:
await bot.send(ev, f'已删除', at_sender=True)
else:
await bot.send(ev, f'删除失败,色图id不正确', at_sender=True)
@sv.on_prefix(('点赞', '好图'))
async def setu_likes(bot, ev: CQEvent):
msg = ev.message.extract_plain_text()
msg = re.sub(r'[??,,_]', ' ', msg)
if msg=='':
await bot.finish(ev, '格式为:点赞空格色图id,例如点赞 12', at_sender=True)
return
if not re.match(r"^[0-9]*$", msg):
await bot.finish(ev, '格式为:点赞空格色图id,例如点赞 12', at_sender=True)
return
setuid = int(msg)
#判断是否赞过
sldao = SetuLikeLogDao()
if sldao.get_user_log(ev.group_id,ev.user_id,setuid,True):
await bot.finish(ev, '你已经赞过这张色图了', at_sender=True)
return
dao = SetuDao()
r = dao.add_like(setuid,True,ev.group_id)
if r:
sldao.add(ev.group_id,ev.user_id,setuid,True)
await bot.send(ev, f'点赞成功', at_sender=True)
else:
await bot.send(ev, f'点赞失败,色图id不正确', at_sender=True)
@sv.on_prefix(('取消点赞', '取消好图'))
async def cancel_setu_likes(bot, ev: CQEvent):
msg = ev.message.extract_plain_text()
msg = re.sub(r'[??,,_]', ' ', msg)
if msg=='':
await bot.finish(ev, '格式为:取消点赞空格色图id,例如取消点赞 12', at_sender=True)
return
if not re.match(r"^[0-9]*$", msg):
await bot.finish(ev, '格式为:取消点赞空格色图id,例如取消点赞 12', at_sender=True)
return
setuid = int(msg)
sldao = SetuLikeLogDao()
if not sldao.get_user_log(ev.group_id,ev.user_id,setuid,True):
await bot.finish(ev, '你没有赞过这张色图', at_sender=True)
return
dao = SetuDao()
r = dao.cancel_like(setuid,True,ev.group_id)
if r:
sldao.delete(ev.group_id,ev.user_id,setuid,True)
await bot.send(ev, f'取消点赞成功', at_sender=True)
else:
await bot.send(ev, f'取消点赞失败,色图id不正确', at_sender=True)
@sv.on_prefix(('点踩', '孬图'))
async def setu_unlikes(bot, ev: CQEvent):
msg = ev.message.extract_plain_text()
msg = re.sub(r'[??,,_]', ' ', msg)
if msg=='':
await bot.finish(ev, '格式为:点踩空格色图id,例如点踩 12', at_sender=True)
return
if not re.match(r"^[0-9]*$", msg):
await bot.finish(ev, '格式为:点踩空格色图id,例如点踩 12', at_sender=True)
return
setuid = int(msg)
#判断是否踩过
sldao = SetuLikeLogDao()
if sldao.get_user_log(ev.group_id,ev.user_id,setuid,False):
await bot.finish(ev, '你已经踩过这张色图了', at_sender=True)
return
dao = SetuDao()
r = dao.add_like(setuid,False,ev.group_id)
if r:
sldao.add(ev.group_id,ev.user_id,setuid,False)
await bot.send(ev, f'点踩成功', at_sender=True)
else:
await bot.send(ev, f'点踩失败,色图id不正确', at_sender=True)
@sv.on_prefix(('取消点踩', '取消孬图'))
async def cancel_setu_unlikes(bot, ev: CQEvent):
msg = ev.message.extract_plain_text()
msg = re.sub(r'[??,,_]', ' ', msg)
if msg=='':
await bot.finish(ev, '格式为:取消点踩空格色图id,例如取消点赞 12', at_sender=True)
return
if not re.match(r"^[0-9]*$", msg):
await bot.finish(ev, '格式为:取消点踩空格色图id,例如取消点赞 12', at_sender=True)
return
setuid = int(msg)
sldao = SetuLikeLogDao()
if not sldao.get_user_log(ev.group_id,ev.user_id,setuid,False):
await bot.finish(ev, '你没有踩过这张色图', at_sender=True)
return
dao = SetuDao()
r = dao.cancel_like(setuid,False,ev.group_id)
if r:
sldao.delete(ev.group_id,ev.user_id,setuid,False)
await bot.send(ev, f'取消点踩成功', at_sender=True)
else:
await bot.send(ev, f'取消点踩失败,色图id不正确', at_sender=True)