Skip to content
This repository has been archived by the owner on Aug 23, 2020. It is now read-only.

Commit

Permalink
增加monitorTables选项
Browse files Browse the repository at this point in the history
  • Loading branch information
pandolia committed Mar 30, 2017
1 parent 720c50a commit e7009f9
Show file tree
Hide file tree
Showing 7 changed files with 100 additions and 12 deletions.
18 changes: 16 additions & 2 deletions README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,8 @@ List 接口的第一个参数 tinfo 也可以是一个 ctype 等于 'group'/'dis
@qqbotslot
def onNewContact(bot, contact, owner):
# 当新增 好友/群/讨论组/群成员/讨论组成员 时被调用
# 一般情况下联系人变动事件滞后 5 ~ 10 分钟,可以将关心的联系人列表加入到配置文件的 monitorTables 中去
# 若 monitorTables 中的列表数量较少,则被监视的列表中的联系人变动事件滞后时间将大幅缩短
# bot : QQBot 对象
# contact : QContact 对象,代表新增的联系人
# owner : QContact 对象,仅在新增 群成员/讨论组成员 时有效,代表新增成员所在的 群/讨论组
Expand All @@ -223,6 +225,8 @@ List 接口的第一个参数 tinfo 也可以是一个 ctype 等于 'group'/'dis
@qqbotslot
def onLostContact(bot, contact, owner):
# 当失去 好友/群/讨论组/群成员/讨论组成员 时被调用
# 一般情况下联系人变动事件滞后 5 ~ 10 分钟,可以将关心的联系人列表加入到配置文件的 monitorTables 中去
# 若 monitorTables 中的列表数量较少,则被监视的列表中的联系人变动事件滞后时间将大幅缩短
# bot : QQBot 对象
# contact : QContact 对象,代表失去的联系人
# owner : QContact 对象,仅在失去 群成员/讨论组成员 时有效,代表失去成员所在的 群/讨论组
Expand Down Expand Up @@ -310,6 +314,12 @@ GUI 模式是默认的模式,只适用于个人电脑。邮箱模式可以适
# 完成全部联系人列表获取之后才启动 QQBot
"startAfterFetch" : False,
# 需要被特别监视的联系人列表
# 'buddy'/'group'/'discuss' 表示需要特别监视 好友列表/群列表/讨论组列表 中的联系人变动事件
# 'group-member-456班'/'discuss-member-xx小组' 表示需要特别监视 群”456班“成员列表/讨论组”xx小组“成员列表 中的联系人变动事件
# 若此项中的列表的数量较少,则被特别监视的列表中的联系人变动事件滞后时间可大幅缩短
"monitorTables" : ['buddy', 'group-member-456班'],
},
# 请勿修改本项中的设置
Expand All @@ -324,6 +334,7 @@ GUI 模式是默认的模式,只适用于个人电脑。邮箱模式可以适
"restartOnOffline" : False,
"fetchInterval" : 120,
"startAfterFetch" : False,
"monitorTables" : [],
},

}
Expand Down Expand Up @@ -379,18 +390,21 @@ QQBot 启动后,会开启一个 QQBot-term 服务器监听用户通过 qq 命

若 debug 项设置为 True ,则运行过程中会打印调试信息。

#### 需要被监视的联系人列表( monitorTables )

一般情况下联系人变动事件(onNewContact/onLostContact)滞后 5 ~ 10 分钟,可以将关心的联系人列表加入到配置文件的 monitorTables 中去,若 monitorTables 中的列表数量较少,则被监视的列表中的联系人变动事件延后时间将大幅缩短。例如,如果关心 群”456班“ 的联系人变动,可以设置 monitorTables = ['group-member-456班'] ,则该群的成员变动事件仅滞后 1~3 秒。

#### 命令行参数

配置文件中的所有选项都有对应的命令行参数,在命令行参数中输入的选项优先级比配置文件高。输入 **qqbot -h****python sample.py -h** 可查看所有命令行参数格式。


八、 smartqq 协议支持及限制
-------------------------

#### 本项目已实现绝大部分 smartqq 协议支持的功能,如下:
+ 消息收/发
+ 联系人(包括 好友/群/讨论组/群成员/讨论组成员)资料获取和查询(包括 QQ号/昵称/名称/备注名/群成员名片)
+ 联系人资料动态更新,新增和丢失 好友/群/讨论组/群成员/讨论组成员 事件的通知(滞后约 5~10 分钟)
+ 联系人资料动态更新,新增和丢失 好友/群/讨论组/群成员/讨论组成员 事件的通知
+ 被群内其他成员 @ 的通知
+ 群管理功能: 设置管理员 、 设置群名片 、 群成员禁言 以及 踢除群成员
+ 发送、接收表情(详见 [facemap.py](https://github.com/pandolia/qqbot/blob/master/qqbot/facemap.py)
Expand Down
3 changes: 3 additions & 0 deletions changes
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
2017-03-30 qqbot v2.1.10
1) 增加 “需要特别监视的列表( monitorTables )” 的选项,将需要关心的群加入到此项中,此群中的成员变动通知的滞后时间可以大幅缩短(最好的情况下可以缩短至 1~3 秒)。

2017-03-30 qqbot v2.1.9
1) 增加 “联系人列表获取完成后再启动 QQBot ( startAfterFetch )” 的选项
2) 修复 smartRequest 方法中的 bug ,感谢 @chenhouwu 反馈
Expand Down
26 changes: 20 additions & 6 deletions qqbot/qconf.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
if p not in sys.path:
sys.path.insert(0, p)

version = 'v2.1.9'
version = 'v2.1.10'

sampleConfStr = '''{
Expand Down Expand Up @@ -43,6 +43,12 @@
# 完成全部联系人列表获取之后才启动 QQBot
"startAfterFetch" : False,
# 需要被特别监视的联系人列表
# 'buddy'/'group'/'discuss' 表示需要特别监视 好友列表/群列表/讨论组列表 中的联系人变动事件
# 'group-member-456班'/'discuss-member-xx小组' 表示需要特别监视 群”456班“成员列表/讨论组”xx小组“成员列表 中的联系人变动事件
# 若此项中的列表的数量较少,则被特别监视的列表中的联系人变动事件滞后时间可大幅缩短
"monitorTables" : ['buddy', 'group-member-456班'],
},
Expand All @@ -58,6 +64,7 @@
"restartOnOffline" : False,
"fetchInterval" : 120,
"startAfterFetch" : False,
"monitorTables" : [],
},
}
Expand Down Expand Up @@ -120,8 +127,10 @@
其他:
-fi FETCHINTERVAL, --fetchInterval FETCHINTERVAL
设置每轮联系人列表更新之间的间歇时间。
-saf --startAfterFetch 全部联系人资料获取完成后再启动 QQBot
设置每轮联系人列表更新之间的间歇时间(单位:秒)。
-saf, --startAfterFetch 全部联系人资料获取完成后再启动 QQBot
-mt MONITORTABLES, --monitorTables MONITORTABLES
设置需要特别监视的列表,如: -mt buddy,group-member-456班
版本:
{VERSION}\
Expand Down Expand Up @@ -159,9 +168,10 @@ def readCmdLine(self):
parser.add_argument('-r', '--restartOnOffline',
action='store_true', default=None)
parser.add_argument('-nr', '--norestart', action='store_true')
parser.add_argument('-fi', '--fetchInterval', type=int)
parser.add_argument('-fi', '--fetchInterval', type=int)
parser.add_argument('-saf', '--startAfterFetch',
action='store_true', default=None)
parser.add_argument('-mt', '--monitorTables')

try:
opts = parser.parse_args()
Expand All @@ -182,6 +192,9 @@ def readCmdLine(self):
delattr(opts, 'nodebug')
delattr(opts, 'norestart')

if opts.monitorTables:
opts.monitorTables = opts.monitorTables.split(',')

for k, v in list(opts.__dict__.items()):
if getattr(self, k, None) is None:
setattr(self, k, v)
Expand Down Expand Up @@ -240,7 +253,7 @@ def readConfFile(self):
sys.exit(1)

for k, v in list(conf.items()):
if getattr(self, k) is None:
if getattr(self, k, None) is None:
setattr(self, k, v)

if self.mailAccount and not self.mailAuthCode:
Expand All @@ -266,10 +279,11 @@ def Display(self):
INFO('邮箱服务授权码:%s', self.mailAccount and '******' or '无')
INFO('调试模式:%s', self.debug and '开启' or '关闭')
INFO('掉线后自动重启:%s', self.restartOnOffline and '是' or '否')
INFO('每轮联系人列表刷新之间的间歇时间:%d', self.fetchInterval)
INFO('每轮联系人列表刷新之间的间歇时间:%d', self.fetchInterval)
INFO('启动方式:%s',
self.startAfterFetch and '慢启动(联系人列表获取完成后再启动)'
or '快速启动(登录成功后立即启动)')
INFO('需要被特别监视的联系人列表:%s', ', '.join(self.monitorTables) or '无')

tmpDir = os.path.join(os.path.expanduser('~'), '.qqbot-tmp')

Expand Down
49 changes: 49 additions & 0 deletions qqbot/qcontactdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ def SetUin(self, c, uin):
def List(self, cinfo=None):
if cinfo is None:
return self.clist[:]

if not cinfo:
return []

for tag in TAGS:
if cinfo.startswith(tag):
Expand Down Expand Up @@ -295,6 +298,52 @@ def fetchUpdate(self, tinfo, needFetch, tinfoQueue, bot):
time.sleep(5)

Put(self.autoUpdate, tinfoQueue, bot)

# dancing with 'monitorFetch', in mainThread
def MonitorForever(self, bot):
if bot.conf.monitorTables:
session = self.session.Copy()
monitorTables = bot.conf.monitorTables[:]
PutTo('monitor-fetch', lambda : (
INFO('特别监视将在 30 秒后启动'),
time.sleep(30),
INFO('特别监视已启动'),
Put(self.monitor, monitorTables, session, bot)
))

# dancing with `monitor-fetch`, in main thread
def monitor(self, monitorTables, session, bot):
self.table('buddy')
self.table('group')
self.table('discuss')

for tname in monitorTables[:]:
if tname in ('buddy', 'group', 'discuss'):
tl = [tname]
elif tname.startswith('group-member-'):
tl = self._table('group').List(tname[13:])
elif tname.startswith('discuss-member-'):
tl = self._table('discuss').List(tname[15:])
else:
tl = []

if not tl:
WARN(('特别监视列表中的 "%s" 不存在,'
'因此将其从特别监视列表中删除'), tname)
monitorTables.remove(tname)
else:
PutTo('monitor-fetch', self.monitorFetch, session, tl, bot)

if monitorTables:
PutTo('monior-fetch',
Put, self.monitor, monitorTables, session, bot)

# dancing with `monitor`, in child thread 'monitor-fetch'
def monitorFetch(self, session, tl, bot):
for tinfo in tl:
table = session.FetchTable(tinfo)
table and Put(self.updateTable, tinfo, table, bot)
time.sleep(3)

def StrOfList(self, ctype, info1=None, info2=None):
if ctype in ('buddy', 'group', 'discuss'):
Expand Down
10 changes: 7 additions & 3 deletions qqbot/qqbotcls.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,9 @@ def Login(self, qq=None, user=None):

# runs in main thread, but puts tasks into child thread 3
self.updateForever = contactdb.UpdateForever

# runs in main thread, but puts tasks into child thread 4
self.monitorForever = contactdb.MonitorForever

def Run(self):
import qqbot.qslots as _x; _x
Expand All @@ -108,10 +111,11 @@ def Run(self):
self.onFetchComplete()

self.onStartupComplete()

Put(self.updateForever, bot=self)

StartDaemonThread(self.pollForever)
StartDaemonThread(self.termForver, self.onTermCommand)
Put(self.updateForever, bot=self)
Put(self.monitorForever, bot=self)
StartDaemonThread(self.intervalForever)

MainLoop()
Expand Down Expand Up @@ -171,7 +175,7 @@ def onPollComplete(self, ctype, fromUin, memberUin, content):

Put(self.onQQMessage, contact, member, content)

# child thread 4
# child thread 5
def intervalForever(self):
while True:
time.sleep(300)
Expand Down
4 changes: 4 additions & 0 deletions qqbot/qslots.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ def onQQMessage(bot, contact, member, content):
@qqbotslot
def onNewContact(bot, contact, owner):
# 当新增 好友/群/讨论组/群成员/讨论组成员 时被调用
# 一般情况下联系人变动事件延后 5 ~ 10 分钟,可以将关心的联系人列表加入到配置文件的 monitorTables 中去
# 若 monitorTables 中的列表数量较少,则被监视的列表中的联系人变动事件延后时间将大幅缩短
# bot : QQBot 对象
# contact : QContact 对象,代表新增的联系人
# owner : QContact 对象,仅在新增 群成员/讨论组成员 时有效,代表新增成员所在的 群/讨论组
Expand All @@ -35,6 +37,8 @@ def onNewContact(bot, contact, owner):
@qqbotslot
def onLostContact(bot, contact, owner):
# 当失去 好友/群/讨论组/群成员/讨论组成员 时被调用
# 一般情况下联系人变动事件延后 5 ~ 10 分钟,可以将关心的联系人列表加入到配置文件的 monitorTables 中去
# 若 monitorTables 中的列表数量较少,则被监视的列表中的联系人变动事件延后时间将大幅缩短
# bot : QQBot 对象
# contact : QContact 对象,代表失去的联系人
# owner : QContact 对象,仅在失去 群成员/讨论组成员 时有效,代表失去成员所在的 群/讨论组
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from setuptools import setup

version = '2.1.9'
version = '2.1.10'

setup(
name = 'qqbot',
Expand Down

0 comments on commit e7009f9

Please sign in to comment.