Cleaned up code for all commands that display Chat objects.

This commit is contained in:
Ross Scroggs
2024-03-30 09:37:43 -07:00
parent 62b7b5d84b
commit 0a21f2c959
5 changed files with 73 additions and 133 deletions

View File

@@ -10,6 +10,10 @@ Add the `-s` option to the end of the above commands to suppress creating the `g
See [Downloads](https://github.com/taers232c/GAMADV-XTD3/wiki/Downloads) for Windows or other options, including manual installation
### 6.72.05
Cleaned up code for all commands that display Chat objects.
### 6.72.04
Added commands to display Chat events.

View File

@@ -334,7 +334,7 @@ writes the credentials into the file oauth2.txt.
admin@server:/Users/admin/bin/gamadv-xtd3$ rm -f /Users/admin/GAMConfig/oauth2.txt
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam version
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found
GAMADV-XTD3 6.72.04 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
GAMADV-XTD3 6.72.05 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
Ross Scroggs <ross.scroggs@gmail.com>
Python 3.12.2 64-bit final
MacOS Sonoma 14.2.1 x86_64
@@ -1006,7 +1006,7 @@ writes the credentials into the file oauth2.txt.
C:\GAMADV-XTD3>del C:\GAMConfig\oauth2.txt
C:\GAMADV-XTD3>gam version
WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found
GAMADV-XTD3 6.72.04 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
GAMADV-XTD3 6.72.05 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
Ross Scroggs <ross.scroggs@gmail.com>
Python 3.12.2 64-bit final
Windows-10-10.0.17134 AMD64

View File

@@ -3,7 +3,7 @@
Print the current version of Gam with details
```
gam version
GAMADV-XTD3 6.72.04 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
GAMADV-XTD3 6.72.05 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
Ross Scroggs <ross.scroggs@gmail.com>
Python 3.12.2 64-bit final
MacOS Sonoma 14.2.1 x86_64
@@ -15,7 +15,7 @@ Time: 2023-06-02T21:10:00-07:00
Print the current version of Gam with details and time offset information
```
gam version timeoffset
GAMADV-XTD3 6.72.04 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
GAMADV-XTD3 6.72.05 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
Ross Scroggs <ross.scroggs@gmail.com>
Python 3.12.2 64-bit final
MacOS Sonoma 14.2.1 x86_64
@@ -27,7 +27,7 @@ Your system time differs from www.googleapis.com by less than 1 second
Print the current version of Gam with extended details and SSL information
```
gam version extended
GAMADV-XTD3 6.72.04 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
GAMADV-XTD3 6.72.05 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
Ross Scroggs <ross.scroggs@gmail.com>
Python 3.12.2 64-bit final
MacOS Sonoma 14.2.1 x86_64
@@ -64,7 +64,7 @@ MacOS High Sierra 10.13.6 x86_64
Path: /Users/Admin/bin/gamadv-xtd3
Version Check:
Current: 5.35.08
Latest: 6.72.04
Latest: 6.72.05
echo $?
1
```
@@ -72,7 +72,7 @@ echo $?
Print the current version number without details
```
gam version simple
6.72.04
6.72.05
```
In Linux/MacOS you can do:
```
@@ -82,7 +82,7 @@ echo $VER
Print the current version of Gam and address of this Wiki
```
gam help
GAM 6.72.04 - https://github.com/taers232c/GAMADV-XTD3
GAM 6.72.05 - https://github.com/taers232c/GAMADV-XTD3
Ross Scroggs <ross.scroggs@gmail.com>
Python 3.12.2 64-bit final
MacOS Sonoma 14.2.1 x86_64

View File

@@ -2,6 +2,10 @@
Merged GAM-Team version
6.72.05
Cleaned up code for all commands that display Chat objects.
6.72.04
Added commands to display Chat events.

View File

@@ -25039,6 +25039,45 @@ def exitIfChatNotConfigured(chat, kvList, errMsg, i, count):
systemErrorExit(API_ACCESS_DENIED_RC, Msg.TO_SET_UP_GOOGLE_CHAT.format(setupChatURL(chat)))
entityActionFailedWarning(kvList, errMsg, i, count)
def _cleanChatSpace(space):
space.pop('type', None)
space.pop('threaded', None)
def _cleanChatMessage(message):
message.pop('cards', None)
CHAT_TIME_OBJECTS = {'createTime', 'deleteTime', 'eventTime', 'lastUpdateTime'}
def _showChatItem(citem, entityType, FJQC, i=0, count=0):
if entityType == Ent.CHAT_SPACE:
_cleanChatSpace(citem)
elif entityType == Ent.CHAT_MESSAGE:
_cleanChatMessage(citem)
if FJQC.formatJSON:
printLine(json.dumps(cleanJSON(citem, timeObjects=CHAT_TIME_OBJECTS), ensure_ascii=False, sort_keys=True))
return
printEntity([entityType, citem['name']], i, count)
Ind.Increment()
showJSON(None, citem, timeObjects=CHAT_TIME_OBJECTS)
Ind.Decrement()
def _printChatItem(user, citem, parent, entityType, csvPF, FJQC):
if entityType == Ent.CHAT_SPACE:
_cleanChatSpace(citem)
baserow = {'User': user} if user is not None else {}
else:
if entityType == Ent.CHAT_MESSAGE:
_cleanChatMessage(citem)
baserow = {'User': user, 'space.name': parent} if user is not None else {'space.name': parent}
row = flattenJSON(citem, flattened=baserow.copy(), timeObjects=CHAT_TIME_OBJECTS)
if not FJQC.formatJSON:
csvPF.WriteRowTitles(row)
elif csvPF.CheckRowTitles(row):
row = baserow.copy()
row.update({'name': citem['name'],
'JSON': json.dumps(cleanJSON(citem, timeObjects=CHAT_TIME_OBJECTS), ensure_ascii=False, sort_keys=True)})
csvPF.WriteRowNoFilter(row)
# gam setup chat
def doSetupChat():
checkForExtraneousArguments()
@@ -25057,23 +25096,6 @@ def getChatSpace(myarg):
_, chatSpace = Cmd.Previous().split('/', 1)
return 'spaces/'+chatSpace
def _cleanChatSpace(space):
space.pop('type', None)
space.pop('threaded', None)
CHAT_SPACE_TIME_OBJECTS = {'createTime'}
def _showChatSpace(space, FJQC, i=0, count=0):
_cleanChatSpace(space)
if FJQC.formatJSON:
printLine(json.dumps(cleanJSON(space, timeObjects=CHAT_SPACE_TIME_OBJECTS),
ensure_ascii=False, sort_keys=True))
return
printEntity([Ent.CHAT_SPACE, space['name']], i, count)
Ind.Increment()
showJSON(None, space, timeObjects=CHAT_SPACE_TIME_OBJECTS)
Ind.Decrement()
def getChatSpaceParameters(myarg, body, typeChoicesMap, updateMask):
if myarg == 'displayname':
body['displayName'] = getString(Cmd.OB_STRING, minLen=0, maxLen=128)
@@ -25195,7 +25217,7 @@ def createChatSpace(users):
if not FJQC.formatJSON:
entityActionPerformed(kvList, i, count)
Ind.Increment()
_showChatSpace(space, FJQC)
_showChatItem(space, Ent.CHAT_SPACE, FJQC)
Ind.Decrement()
else:
writeStdout(f'{space["name"]}\n')
@@ -25263,7 +25285,7 @@ def updateChatSpace(users):
if not FJQC.formatJSON:
entityActionPerformed(kvList, i, count)
Ind.Increment()
_showChatSpace(space, FJQC)
_showChatItem(space, Ent.CHAT_SPACE, FJQC)
Ind.Decrement()
except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
exitIfChatNotConfigured(chat, kvList, str(e), i, count)
@@ -25319,7 +25341,7 @@ def infoChatSpace(users, name=None):
if not FJQC.formatJSON:
entityPerformAction(kvList, i, count)
Ind.Increment()
_showChatSpace(space, FJQC)
_showChatItem(space, Ent.CHAT_SPACE, FJQC)
Ind.Decrement()
except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
exitIfChatNotConfigured(chat, kvList, str(e), i, count)
@@ -25350,20 +25372,6 @@ CHAT_PAGE_SIZE = 1000
# [types <ChatSpaceTypeList>]
# [formatjson [quotechar <Character>]]
def printShowChatSpaces(users):
def _printChatSpace(user, space):
_cleanChatSpace(space)
row = flattenJSON(space, timeObjects=CHAT_SPACE_TIME_OBJECTS)
if user is not None:
row['User'] = user
if not FJQC.formatJSON:
csvPF.WriteRowTitles(row)
elif csvPF.CheckRowTitles(row):
row = {'User': user} if user is not None else {}
row.update({'name': space['name'],
'JSON': json.dumps(cleanJSON(space, timeObjects=CHAT_SPACE_TIME_OBJECTS),
ensure_ascii=False, sort_keys=True)})
csvPF.WriteRowNoFilter(row)
csvPF = CSVPrintFile(['User', 'name'] if not isinstance(users, list) else ['name']) if Act.csvFormat() else None
FJQC = FormatJSONQuoteChar(csvPF)
pfilter = ''
@@ -25410,11 +25418,11 @@ def printShowChatSpaces(users):
j = 0
for space in spaces:
j += 1
_showChatSpace(space, FJQC, j, jcount)
_showChatItem(space, Ent.CHAT_SPACE, FJQC, j, jcount)
Ind.Decrement()
else:
for space in spaces:
_printChatSpace(user, space)
_printChatItem(user, space, None, Ent.CHAT_SPACE, csvPF, FJQC)
if csvPF:
csvPF.writeCSVfile('Chat Spaces')
@@ -25430,18 +25438,6 @@ def _getChatMemberEmail(cd, member):
_, memberUid = member['groupMember']['name'].split('/')
member['groupMember']['email'], _ = convertUIDtoEmailAddressWithType(f'uid:{memberUid}', cd, emailTypes=['group'])
CHAT_MEMBER_TIME_OBJECTS = {'createTime', 'deleteTime'}
def _showChatMember(member, FJQC, i=0, count=0):
if FJQC.formatJSON:
printLine(json.dumps(cleanJSON(member, timeObjects=CHAT_MEMBER_TIME_OBJECTS),
ensure_ascii=False, sort_keys=True))
return
printEntity([Ent.CHAT_MEMBER, member['name']], i, count)
Ind.Increment()
showJSON(None, member, timeObjects=CHAT_MEMBER_TIME_OBJECTS)
Ind.Decrement()
# gam <UserTypeEntity> create chatmember <ChatSpace>
# [type human|bot] [role member|manager]
# (user <UserItem>)* (members <UserTypeEntity>)*
@@ -25475,7 +25471,7 @@ def createChatMember(users):
if not FJQC.formatJSON:
entityActionPerformed(kvList, j, jcount)
Ind.Increment()
_showChatMember(member, FJQC)
_showChatItem(member, Ent.CHAT_MEMBER, FJQC)
Ind.Decrement()
else:
writeStdout(f'{member["name"]}\n')
@@ -25566,6 +25562,7 @@ def _deleteChatMembers(chat, kvList, jcount, memberNames, i, count):
# members <ChatMemberList>
def deleteUpdateChatMember(users):
cd = buildGAPIObject(API.DIRECTORY)
FJQC = FormatJSONQuoteChar()
action = Act.Get()
deleteMode = action in {Act.DELETE, Act.REMOVE}
parent = None
@@ -25633,7 +25630,7 @@ def deleteUpdateChatMember(users):
name=name, updateMask='role', body=body)
_getChatMemberEmail(cd, member)
Ind.Increment()
_showChatMember(member, None, j, jcount)
_showChatItem(member, Ent.CHAT_MEMBER, FJQC, j, jcount)
Ind.Decrement()
except GAPI.notFound as e:
entityActionFailedWarning(kvList, str(e), j, jcount)
@@ -25834,7 +25831,7 @@ def infoChatMember(users):
name=name)
_getChatMemberEmail(cd, member)
Ind.Increment()
_showChatMember(member, FJQC, j, jcount)
_showChatItem(member, Ent.CHAT_MEMBER, FJQC, j, jcount)
Ind.Decrement()
except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied, GAPI.internalError) as e:
exitIfChatNotConfigured(chat, kvList, str(e), i, count)
@@ -25849,18 +25846,6 @@ def doInfoChatMember():
# [showinvited [<Boolean>]] [showgroups [<Boolean>]] [filter <String>]
# [formatjson [quotechar <Character>]]
def printShowChatMembers(users):
def _printChatMember(user, member):
row = {'User': user, 'space.name': parent} if user is not None else {'space.name': parent}
flattenJSON(member, flattened=row, timeObjects=CHAT_MEMBER_TIME_OBJECTS)
if not FJQC.formatJSON:
csvPF.WriteRowTitles(row)
elif csvPF.CheckRowTitles(row):
row = {'User': user, 'space.name': parent} if user is not None else {'space.name': parent}
row.update({'name': member['name'],
'JSON': json.dumps(cleanJSON(member, timeObjects=CHAT_MEMBER_TIME_OBJECTS),
ensure_ascii=False, sort_keys=True)})
csvPF.WriteRowNoFilter(row)
cd = buildGAPIObject(API.DIRECTORY)
csvPF = CSVPrintFile(['User', 'space.name', 'name'] if not isinstance(users, list) else ['space.name', 'name']) if Act.csvFormat() else None
FJQC = FormatJSONQuoteChar(csvPF)
@@ -25909,11 +25894,11 @@ def printShowChatMembers(users):
j = 0
for member in members:
j += 1
_showChatMember(member, FJQC, j, jcount)
_showChatItem(member, Ent.CHAT_MEMBER, FJQC, j, jcount)
Ind.Decrement()
else:
for member in members:
_printChatMember(user, member)
_printChatItem(user, member, parent, Ent.CHAT_MEMBER, csvPF, FJQC)
if csvPF:
csvPF.writeCSVfile('Chat Members')
@@ -26067,22 +26052,6 @@ def deleteChatMessage(users):
def doDeleteChatMessage():
deleteChatMessage([None])
def _cleanChatMessage(message):
message.pop('cards', None)
CHAT_MESSAGE_TIME_OBJECTS = {'createTime', 'deleteTime', 'lastUpdateTime'}
def _showChatMessage(message, FJQC, i=0, count=0):
_cleanChatMessage(message)
if FJQC.formatJSON:
printLine(json.dumps(cleanJSON(message, timeObjects=CHAT_MESSAGE_TIME_OBJECTS),
ensure_ascii=False, sort_keys=True))
return
printEntity([Ent.CHAT_MESSAGE, message['name']], i, count)
Ind.Increment()
showJSON(None, message, timeObjects=CHAT_MESSAGE_TIME_OBJECTS)
Ind.Decrement()
# gam [<UserTypeEntity>] info chatmessage name <ChatMessage>
# [formatjson]
def infoChatMessage(users):
@@ -26111,7 +26080,7 @@ def infoChatMessage(users):
if not FJQC.formatJSON:
entityPerformAction(kvList, i, count)
Ind.Increment()
_showChatMessage(message, FJQC)
_showChatItem(message, Ent.CHAT_MESSAGE, FJQC)
Ind.Decrement()
except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
exitIfChatNotConfigured(chat, kvList, str(e), i, count)
@@ -26126,19 +26095,6 @@ def doInfoChatMessage():
# [showdeleted [<Boolean>]] [filter <String>]
# [formatjson [quotechar <Character>]]
def printShowChatMessages(users):
def _printChatMessage(user, message):
_cleanChatMessage(message)
row = {'User': user, 'space.name': parent} if user is not None else {'space.name': parent}
flattenJSON(message, flattened=row, timeObjects=CHAT_MESSAGE_TIME_OBJECTS)
if not FJQC.formatJSON:
csvPF.WriteRowTitles(row)
elif csvPF.CheckRowTitles(row):
row = {'User': user, 'space.name': parent} if user is not None else {'space.name': parent}
row.update({'name': message['name'],
'JSON': json.dumps(cleanJSON(message, timeObjects=CHAT_MESSAGE_TIME_OBJECTS),
ensure_ascii=False, sort_keys=True)})
csvPF.WriteRowNoFilter(row)
cd = buildGAPIObject(API.DIRECTORY)
csvPF = CSVPrintFile(['User', 'space.name', 'name'] if not isinstance(users, list) else ['space.name', 'name']) if Act.csvFormat() else None
FJQC = FormatJSONQuoteChar(csvPF)
@@ -26186,26 +26142,14 @@ def printShowChatMessages(users):
j = 0
for message in messages:
j += 1
_showChatMessage(message, FJQC, j, jcount)
_showChatItem(message, Ent.CHAT_MESSAGE, FJQC, j, jcount)
Ind.Decrement()
else:
for message in messages:
_printChatMessage(user, message)
_printChatItem(user, message, parent, Ent.CHAT_MESSAGE, csvPF, FJQC)
if csvPF:
csvPF.writeCSVfile('Chat Messages')
CHAT_EVENT_TIME_OBJECTS = {'createTime', 'deleteTime', 'eventTime', 'lastUpdateTime'}
def _showChatEvent(event, FJQC, i=0, count=0):
if FJQC.formatJSON:
printLine(json.dumps(cleanJSON(event, timeObjects=CHAT_EVENT_TIME_OBJECTS),
ensure_ascii=False, sort_keys=True))
return
printEntity([Ent.CHAT_EVENT, event['name']], i, count)
Ind.Increment()
showJSON(None, event, timeObjects=CHAT_EVENT_TIME_OBJECTS)
Ind.Decrement()
# gam <UserTypeEntity> info chatevent name <ChatEvent>
# [formatjson]
def infoChatEvent(users):
@@ -26232,7 +26176,7 @@ def infoChatEvent(users):
if not FJQC.formatJSON:
entityPerformAction(kvList, i, count)
Ind.Increment()
_showChatEvent(event, FJQC)
_showChatItem(event, Ent.CHAT_EVENT, FJQC)
Ind.Decrement()
except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
exitIfChatNotConfigured(chat, kvList, str(e), i, count)
@@ -26247,18 +26191,6 @@ def doInfoChatEvent():
# filter <String>
# [formatjson [quotechar <Character>]]
def printShowChatEvents(users):
def _printChatEvent(user, event):
row = {'User': user, 'space.name': parent} if user is not None else {'space.name': parent}
flattenJSON(event, flattened=row, timeObjects=CHAT_EVENT_TIME_OBJECTS)
if not FJQC.formatJSON:
csvPF.WriteRowTitles(row)
elif csvPF.CheckRowTitles(row):
row = {'User': user, 'space.name': parent} if user is not None else {'space.name': parent}
row.update({'name': event['name'],
'JSON': json.dumps(cleanJSON(event, timeObjects=CHAT_EVENT_TIME_OBJECTS),
ensure_ascii=False, sort_keys=True)})
csvPF.WriteRowNoFilter(row)
csvPF = CSVPrintFile(['User', 'space.name', 'name'] if not isinstance(users, list) else ['space.name', 'name']) if Act.csvFormat() else None
FJQC = FormatJSONQuoteChar(csvPF)
parent = pfilter = None
@@ -26285,7 +26217,7 @@ def printShowChatEvents(users):
continue
try:
events = callGAPIpages(chat.spaces().spaceEvents(), 'list', 'spaceEvents',
pageMessage=_getChatPageMessage(Ent.CHAT_MESSAGE, user, i, count, qfilter),
pageMessage=_getChatPageMessage(Ent.CHAT_EVENT, user, i, count, qfilter),
throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
pageSize=CHAT_PAGE_SIZE, parent=parent, filter=pfilter)
except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
@@ -26299,11 +26231,11 @@ def printShowChatEvents(users):
j = 0
for event in events:
j += 1
_showChatEvent(event, FJQC, j, jcount)
_showChatItem(event, Ent.CHAT_EVENT, FJQC, j, jcount)
Ind.Decrement()
else:
for event in events:
_printChatEvent(user, event)
_printChatItem(user, event, parent, Ent.CHAT_EVENT, csvPF, FJQC)
if csvPF:
csvPF.writeCSVfile('Chat Events')