/
meetingRoom.go
253 lines (207 loc) · 9.39 KB
/
meetingRoom.go
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
package bbb4go
import (
"encoding/xml"
"log"
"math/rand"
"net/url"
"strconv"
"github.com/MsloveDl/bbb4go/command"
"github.com/MsloveDl/bbb4go/config"
"github.com/MsloveDl/bbb4go/models"
)
/*******************************************************************************
* 会议室类, 抽象一个会议室模型, 管理整个会议
*******************************************************************************/
type MeetingRoom struct {
Name_ string // 必填, 会议名称;
MeetingID_ string // 必填, 会议ID, 必须是唯一的;
AttendeePW_ string // 必填, 与会者密码;
ModeratorPW_ string // 必填, 会议管理员密码;
Welcome string // 可选, 欢迎语, 具有格式化功能, 参考说明;
DialNumber string // 可选, 可通过电话直接拨入语音会议的号码;
VoiceBridge string // 可选, 通过电话拨入语音会议时需要输入的PIN码;
WebVoice string // 可选, 通过Web方式加入语音会议时需要输入的PIN码;
LogoutURL string // 可选, 退出会议后的URL;
Record string // 可选, 是否录制会议, 默认为false;
Duration int // 可选, 会议时长(分钟), 超过时间后会议自动结束. 默认为0;
Meta string // 可选, 会议的元信息描述;
ModeratorOnlyMessage string // 可选, 显示一个消息给所有公共聊天室的人;
AutoStartRecording bool // 可选, 当第一个用户进入时自动开始录制会议, 默认为false;
AllowStartStopRecording bool // 可选, 是否允许用户启动/停止录制, 默认为true;
CreateMeetingResponse models.CreateMeetingResponse // 建立会议室返回信息
MeetingInfo models.GetMeetingInfoResponse // 会议室的当前信息
Participantses []Participants // 会议参与者
}
/*******************************************************************************
* 根据会议室的配置创建会议室, 将返回信息存储在CreateMeetingResponse属性中
* 返回: 创建成功返回会议室ID, 创建失败返回ERROR及失败内容
*******************************************************************************/
func (meetingRoom *MeetingRoom) CreateMeeting() string {
// 检查必填字段
if "" == meetingRoom.Name_ || "" == meetingRoom.MeetingID_ ||
"" == meetingRoom.AttendeePW_ || "" == meetingRoom.ModeratorPW_ {
log.Println("ERROR: PARAM ERROR.")
return "ERROR: PARAM ERROR."
}
// 根据对象字段构造必填参数
name := "name=" + url.QueryEscape(meetingRoom.Name_) // 会议名称
meetingID := "&meetingID=" + url.QueryEscape(meetingRoom.MeetingID_) // 会议ID
attendeePW := "&attendeePW=" + url.QueryEscape(meetingRoom.AttendeePW_) // 与会者密码
moderatorPW := "&moderatorPW=" + url.QueryEscape(meetingRoom.ModeratorPW_) // 管理员密码
var welcome string // 欢迎语
var logoutURL string // 退出后地址
var record string // 是否可以录制
var duration string // 会议时长
var moderatorOnlyMessage string // 问候语
var allowStartStopRecording string // 是否允许启动/停止录制
var voiceBridge string // 通过Web加入语音会议时的PIN码
if "" != meetingRoom.Welcome {
welcome = "&welcome=" + url.QueryEscape(meetingRoom.Welcome)
}
if "" != meetingRoom.LogoutURL {
logoutURL = "&logoutURL=" + url.QueryEscape(meetingRoom.LogoutURL)
}
if "" != meetingRoom.Record {
record = "&record=" + url.QueryEscape(meetingRoom.Record)
}
//-----------------------------------------------------------------------------
// 这里可能有问题, 未做字段内容校验, 如果有错着重检查
duration = "&duration=" + url.QueryEscape(strconv.Itoa(meetingRoom.Duration))
allowStartStopRecording = "&allowStartStopRecording=" +
url.QueryEscape(strconv.FormatBool(meetingRoom.AllowStartStopRecording))
//-----------------------------------------------------------------------------
if "" != meetingRoom.ModeratorOnlyMessage {
moderatorOnlyMessage = "&moderatorOnlyMessage=" +
url.QueryEscape(meetingRoom.ModeratorOnlyMessage)
} else {
moderatorOnlyMessage = "&moderatorOnlyMessage=" +
url.QueryEscape("我是["+meetingRoom.Name_+"]大家好.")
}
if "" != meetingRoom.VoiceBridge {
voiceBridge = "&voiceBridge=" + url.QueryEscape(meetingRoom.VoiceBridge)
} else {
// 如果VoiceBridge参数为空, 那么我们分配一个随机数给它
rand.Seed(9999)
nTemp := 70000 + rand.Intn(9999)
voiceBridge = "&voiceBridge=" + url.QueryEscape(strconv.Itoa(nTemp))
}
// 合成请求的参数
createParam := name + meetingID + attendeePW + moderatorPW + welcome +
voiceBridge + logoutURL + record + duration + moderatorOnlyMessage +
allowStartStopRecording
checksum := command.GetChecksum("create", createParam, config.SALT)
// 发出请求
createResponse := command.HttpGet(config.BASE_URL + "create?" + createParam + "&checksum=" +
checksum)
if "ERROR" == createResponse {
log.Println("ERROR: HTTP ERROR.")
return "ERROR: HTTP ERROR."
}
// 解析返回的XML结果, 判断是否成功创建会议室
err := xml.Unmarshal([]byte(createResponse),
&meetingRoom.CreateMeetingResponse)
if nil != err {
log.Println("XML PARSE ERROR: " + err.Error())
return "ERROR: XML PARSE ERROR."
}
if "SUCCESS" == meetingRoom.CreateMeetingResponse.Returncode {
log.Println("SUCCESS CREATE MEETINGROOM. MEETING ID: " +
meetingRoom.CreateMeetingResponse.MeetingID)
return meetingRoom.CreateMeetingResponse.MeetingID
} else {
log.Println("CREATE MEETINGROOM FAILD: " + createResponse)
return "FAILD"
}
return "ERROR: UNKONW."
}
/*******************************************************************************
* 检查当前会议室是否正常运行(开门). 当会议室中没有参与者的时候, 该接口调用将认为此会议室
* 未运行, 返回false
* 返回: true, 会议室运行正常; false, 会议室不存在
*******************************************************************************/
func (meetingRoom *MeetingRoom) IsMeetingRunning() bool {
if "" == meetingRoom.MeetingID_ {
log.Println("ERROR: PARAM ERROR.")
return false
}
createParam := "meetingID=" + url.QueryEscape(meetingRoom.MeetingID_)
checksum := command.GetChecksum("isMeetingRunning", createParam, config.SALT)
createResponse := command.HttpGet(config.BASE_URL + "isMeetingRunning?" + createParam +
"&checksum=" + checksum)
if "ERROR" == createResponse {
log.Println("ERROR: HTTP ERROR.")
return false
}
responseXML := models.IsMeetingRunningResponse{}
err := xml.Unmarshal([]byte(createResponse), &responseXML)
if nil != err {
log.Println("XML PARSE ERROR: " + err.Error())
return false
}
if "SUCCESS" == responseXML.ReturnCode {
log.Println("CALLED SUCCESS.")
return responseXML.Running
}
return false
}
/*******************************************************************************
* 注销会议室, 并且将在会议室中的参与者踢出. 该接口服务器做的是不负责任调用, 我们应该在调
* 用该接口一段时间后进行getMeetingInfo或者isMeetingRunning接口调用, 以对关闭操作进行
* 验证, 确保已经成功执行
* 返回: 调用成功返回true, 否则返回false
*******************************************************************************/
func (meetingRoom *MeetingRoom) End() bool {
if "" == meetingRoom.MeetingID_ || "" == meetingRoom.ModeratorPW_ {
log.Println("ERROR: PARAM ERROR.")
return false
}
createParam := "meetingID=" + url.QueryEscape(meetingRoom.MeetingID_) +
"&password=" + url.QueryEscape(meetingRoom.ModeratorPW_)
checksum := command.GetChecksum("end", createParam, config.SALT)
createResponse := command.HttpGet(config.BASE_URL + "end?" + createParam + "&checksum=" +
checksum)
if "ERROR" == createResponse {
log.Println("ERROR: HTTP ERROR.")
return false
}
responseXML := models.EndResponse{}
err := xml.Unmarshal([]byte(createResponse), &responseXML)
if nil != err {
log.Println("XML PARSE ERROR: " + err.Error())
return false
}
if "SUCCESS" == responseXML.ReturnCode {
log.Println("END MEETING SUCCESS.")
return true
}
return false
}
/*******************************************************************************
* 获取会议室的详细信息, 并且刷新会议室实体中会议室详细信息的描述
* 返回: 会议室详细信息
*******************************************************************************/
func (meetingRoom *MeetingRoom) GetMeetingInfo() *models.GetMeetingInfoResponse {
if "" == meetingRoom.MeetingID_ || "" == meetingRoom.ModeratorPW_ {
log.Println("ERROR: PARAM ERROR.")
return nil
}
createParam := "meetingID=" + url.QueryEscape(meetingRoom.MeetingID_) +
"&password=" + url.QueryEscape(meetingRoom.ModeratorPW_)
checksum := command.GetChecksum("getMeetingInfo", createParam, config.SALT)
createResponse := command.HttpGet(config.BASE_URL + "getMeetingInfo?" + createParam +
"&checksum=" + checksum)
if "ERROR" == createResponse {
log.Println("ERROR: HTTP ERROR.")
return nil
}
err := xml.Unmarshal([]byte(createResponse), &meetingRoom.MeetingInfo)
if nil != err {
log.Println("XML PARSE ERROR: " + err.Error())
return nil
}
if "SUCCESS" == meetingRoom.MeetingInfo.ReturnCode {
log.Println("GET MEETING INFO SUCCESS.")
return &meetingRoom.MeetingInfo
}
return nil
}