bbbctl 0.2.0__tar.gz → 0.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: bbbctl
3
- Version: 0.2.0
3
+ Version: 0.3.1
4
4
  Summary: BigBlueButton API command-line client
5
5
  Home-page: https://github.com/defnull/bbbctl
6
6
  Author: Marcel Hellkamp
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = bbbctl
3
- version = 0.2.0
3
+ version = 0.3.1
4
4
  author = Marcel Hellkamp
5
5
  author_email = marc@gsites.de
6
6
  description = BigBlueButton API command-line client
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: bbbctl
3
- Version: 0.2.0
3
+ Version: 0.3.1
4
4
  Summary: BigBlueButton API command-line client
5
5
  Home-page: https://github.com/defnull/bbbctl
6
6
  Author: Marcel Hellkamp
@@ -28,7 +28,7 @@ class BBBApiClient:
28
28
  self.ssl = ssl_context or ssl.create_default_context()
29
29
 
30
30
  def makeurl(self, command, **query):
31
- query = urllib.parse.urlencode(query)
31
+ query = urllib.parse.urlencode({k:v for k,v in query.items() if v is not None})
32
32
  checksum = hashlib.sha1(
33
33
  (command + query + self.secret).encode("utf8")
34
34
  ).hexdigest()
@@ -70,6 +70,9 @@ class BBBApiClient:
70
70
  def deleteRecordings(self, recordID):
71
71
  return self.call("deleteRecordings", recordID=recordID)
72
72
 
73
+ def sendChatMessage(self, meetingID, message, userName=None):
74
+ return self.call("sendChatMessage", meetingID=meetingID, message=message, userName=userName)
75
+
73
76
 
74
77
  def build_parser():
75
78
 
@@ -129,7 +132,7 @@ def build_parser():
129
132
 
130
133
  cmd = meet_sub.add_parser("list", help="List meetings")
131
134
  cmd.add_argument("--sort", help="Sort by a specific key")
132
- cmd.add_argument("--no-user", action="store_true", help="Do not show participatns")
135
+ cmd.add_argument("--no-user", action="store_true", help="Do not show participants")
133
136
  cmd.set_defaults(cmd=cmd_meet_list)
134
137
 
135
138
  cmd = meet_sub.add_parser("info", help="Show meeting details")
@@ -139,10 +142,10 @@ def build_parser():
139
142
  cmd = meet_sub.add_parser("create", help="Create meeting")
140
143
  cmd.add_argument("id", help="Meeting ID")
141
144
  cmd.add_argument("name", help="Meeting name")
142
- cmd.add_argument("--record", help="Allow recodring?", action="store_true")
145
+ cmd.add_argument("--record", help="Allow recording?", action="store_true")
143
146
  cmd.add_argument(
144
147
  "--mod",
145
- help="Directly create and print a join link for this username. Can be repeated.",
148
+ help="Directly create and print a moderator join link for this username. Can be repeated.",
146
149
  action="append",
147
150
  )
148
151
  cmd.set_defaults(cmd=cmd_meet_create)
@@ -164,8 +167,15 @@ def build_parser():
164
167
  cmd.add_argument("id", help="Meeting ID")
165
168
  cmd.set_defaults(cmd=cmd_meet_end)
166
169
 
170
+ cmd = meet_sub.add_parser("chat", help="Send a chat message into a running meeting (BBB 3.0)")
171
+ cmd.add_argument("id", help="Meeting ID. Can be 'BROADCAST' do broadcase a message to all running meetings")
172
+ cmd.add_argument("message", help="The message to send to chat")
173
+ cmd.add_argument("--name", help="The name that will be shown as the sender of the chat message", default="SYSTEM")
174
+ cmd.set_defaults(cmd=cmd_meet_chat)
175
+
167
176
  cmd = meet_sub.add_parser("nuke", help="End ALL meeting")
168
- cmd.add_argument("--doit", help="Really end all meetings?", action="store_true")
177
+ cmd.add_argument("--doit", help="Disable dry-run mode and actually end meetings?", action="store_true")
178
+ cmd.add_argument("--ask", help="Ask for every meeting?", action="store_true")
169
179
  cmd.set_defaults(cmd=cmd_meet_nuke)
170
180
 
171
181
  return parser
@@ -374,7 +384,7 @@ def cmd_meet_create(api, args):
374
384
  meetingID=args.id,
375
385
  fullName=name,
376
386
  createTime=created.find("createTime").text,
377
- password=created.find("moderatorPW").text,
387
+ role="MODERATOR",
378
388
  )
379
389
  print(name + ":", link)
380
390
 
@@ -399,14 +409,19 @@ def cmd_meet_end(api, args):
399
409
  api.end(meetingID=args.id, password=pwd)
400
410
 
401
411
 
412
+ def cmd_meet_chat(api, args):
413
+ if args.id == "BROADCAST":
414
+ meetings = [m.find("meetingID").text for m in api.getMeetings()]
415
+ else:
416
+ meetings = [args.id]
417
+
418
+ for meeting in meetings:
419
+ api.sendChatMessage(meeting, args.message, userName=args.name)
420
+
421
+
402
422
  def cmd_meet_nuke(api, args):
403
423
  meetings = list(api.getMeetings())
404
424
  for meeting in meetings:
405
- if args.doit:
406
- api.end(
407
- meetingID=meeting.find("meetingID").text,
408
- password=meeting.find("moderatorPW").text,
409
- )
410
425
  print(
411
426
  "{dryrun}id={id} user={users} name={name!r}".format(
412
427
  dryrun="" if args.doit else "(dry run) ",
@@ -415,6 +430,16 @@ def cmd_meet_nuke(api, args):
415
430
  name=meeting.find("meetingName").text,
416
431
  )
417
432
  )
433
+ if args.doit:
434
+ if args.ask:
435
+ answer = input("End this meeting? [Yna] ").strip().lower()
436
+ if answer == "a":
437
+ args.ask = False
438
+ elif answer in ("", "y"):
439
+ pass
440
+ else:
441
+ continue
442
+ api.end(meetingID=meeting.find("meetingID").text)
418
443
 
419
444
 
420
445
  if __name__ == "__main__":
File without changes
File without changes
File without changes