forked from kbengine/kbengine
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkbengine.py
More file actions
137 lines (107 loc) · 5.54 KB
/
Copy pathkbengine.py
File metadata and controls
137 lines (107 loc) · 5.54 KB
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
# -*- coding: utf-8 -*-
import os
import KBEngine
from KBEDebug import *
from Poller import Poller
"""
interfaces进程主要处理KBEngine服务端与第三方平台的接入接出工作。
目前支持几种功能:
1: 注册账号
当客户端请求注册账号后,请求会由loginapp转发到dbmgr,如果dbmgr挂接了interfaces,则dbmgr将请求转发至这里(KBEngine.onRequestCreateAccount)
此时脚本收到这个请求之后可以使用各种方式与第三方平台通信,可以使用python的http库也能直接使用socket,当与第三方平台交互完毕之后应该将
交互的结果返回给引擎层,KBEngine.createAccountResponse。
2:账号登陆
当客户端请求登陆账号后,请求会由loginapp转发到dbmgr,如果dbmgr挂接了interfaces,则dbmgr将请求转发至这里(KBEngine.onRequestAccountLogin)
此时脚本收到这个请求之后可以使用各种方式与第三方平台通信,可以使用python的http库也能直接使用socket,当与第三方平台交互完毕之后应该将
交互的结果返回给引擎层,KBEngine.accountLoginResponse。
3:充值计费
当baseapp上请求计费entity.charge()后,请求会由loginapp转发到dbmgr,如果dbmgr挂接了interfaces,则dbmgr将请求转发至这里(KBEngine.onRequestCharge)
此时脚本收到这个请求之后可以使用各种方式与第三方平台通信,可以使用python的http库也能直接使用socket,当与第三方平台交互完毕之后应该将
交互的结果返回给引擎层,KBEngine.chargeResponse。
某些平台要求客户端直接与平台请求计费,平台采用回调服务器的方式来完成请求, 参考“平台回调”。
4: 平台回调
要完成此功能应该在脚本层创建一个socket,
并将socket挂接到KBEngine中(这样可防止阻塞导致主线程卡),然后监听指定的端口。
使用KBE的KBEngine.registerReadFileDescriptor()和KBEngine.registerWriteFileDescriptor(),具体查看API文档与Poller.py。
"""
g_poller = Poller()
def onInterfaceAppReady():
"""
KBEngine method.
interfaces已经准备好了
"""
INFO_MSG('onInterfaceAppReady: bootstrapGroupIndex=%s, bootstrapGlobalIndex=%s' % \
(os.getenv("KBE_BOOTIDX_GROUP"), os.getenv("KBE_BOOTIDX_GLOBAL")))
#KBEngine.addTimer(0.01, 1.0, onTick)
g_poller.start("localhost", 30040)
def onTick(timerID):
"""
"""
INFO_MSG('onTick()')
def onInterfaceAppShutDown():
"""
KBEngine method.
这个interfaces被关闭前的回调函数
"""
INFO_MSG('onInterfaceAppShutDown()')
g_poller.stop()
def onRequestCreateAccount(registerName, password, datas):
"""
KBEngine method.
请求创建账号回调
@param registerName: 客户端请求时所提交的名称
@type registerName: string
@param password: 密码
@type password: string
@param datas: 客户端请求时所附带的数据,可将数据转发第三方平台
@type datas: bytes
"""
INFO_MSG('onRequestCreateAccount: registerName=%s' % (registerName))
commitName = registerName
# 默认账号名就是提交时的名
realAccountName = commitName
# 此处可通过http等手段将请求提交至第三方平台,平台返回的数据也可放入datas
# datas将会回调至客户端
# 如果使用http访问,因为interfaces是单线程的,同步http访问容易卡住主线程,建议使用
# KBEngine.registerReadFileDescriptor()和KBEngine.registerWriteFileDescriptor()结合
# tornado异步访问。也可以结合socket模拟http的方式与平台交互。
KBEngine.createAccountResponse(commitName, realAccountName, datas, KBEngine.SERVER_SUCCESS)
def onRequestAccountLogin(loginName, password, datas):
"""
KBEngine method.
请求登陆账号回调
@param loginName: 客户端请求时所提交的名称
@type loginName: string
@param password: 密码
@type password: string
@param datas: 客户端请求时所附带的数据,可将数据转发第三方平台
@type datas: bytes
"""
INFO_MSG('onRequestAccountLogin: registerName=%s' % (loginName))
commitName = loginName
# 默认账号名就是提交时的名
realAccountName = commitName
# 此处可通过http等手段将请求提交至第三方平台,平台返回的数据也可放入datas
# datas将会回调至客户端
# 如果使用http访问,因为interfaces是单线程的,同步http访问容易卡住主线程,建议使用
# KBEngine.registerReadFileDescriptor()和KBEngine.registerWriteFileDescriptor()结合
# tornado异步访问。也可以结合socket模拟http的方式与平台交互。
KBEngine.accountLoginResponse(commitName, realAccountName, datas, KBEngine.SERVER_SUCCESS)
def onRequestCharge(ordersID, entityDBID, datas):
"""
KBEngine method.
请求计费回调
@param ordersID: 订单的ID
@type ordersID: uint64
@param entityDBID: 提交订单的实体DBID
@type entityDBID: uint64
@param datas: 客户端请求时所附带的数据,可将数据转发第三方平台
@type datas: bytes
"""
INFO_MSG('onRequestCharge: entityDBID=%s, entityDBID=%s' % (ordersID, entityDBID))
# 此处可通过http等手段将请求提交至第三方平台,平台返回的数据也可放入datas
# datas将会回调至baseapp的订单回调中,具体参考API手册charge
# 如果使用http访问,因为interfaces是单线程的,同步http访问容易卡住主线程,建议使用
# KBEngine.registerReadFileDescriptor()和KBEngine.registerWriteFileDescriptor()结合
# tornado异步访问。也可以结合socket模拟http的方式与平台交互。
KBEngine.chargeResponse(ordersID, datas, KBEngine.SERVER_SUCCESS)