From bc222d2a91f2a785a8fb44aa79b4c123ac2c95c8 Mon Sep 17 00:00:00 2001 From: Ross Scroggs Date: Sun, 7 Jul 2024 21:01:35 -0700 Subject: [PATCH] Fix delete/sync chatmember group bugs --- docs/GamUpdates.md | 5 ++ docs/How-to-Upgrade-from-Standard-GAM.md | 4 +- docs/Version-and-Help.md | 12 ++-- src/GamUpdate.txt | 5 ++ src/gam/__init__.py | 71 +++++++++++++----------- 5 files changed, 56 insertions(+), 41 deletions(-) diff --git a/docs/GamUpdates.md b/docs/GamUpdates.md index 9e030ea2..6d4c0c9f 100644 --- a/docs/GamUpdates.md +++ b/docs/GamUpdates.md @@ -10,6 +10,11 @@ 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.77.08 + +Fixed bugs in `gam delete chatmember ... group ` +and `gam delete chatmember ... groups ` that caused an error. + ### 6.77.07 Fixed bug in `gam create chatmember ... group ` that caused an error. diff --git a/docs/How-to-Upgrade-from-Standard-GAM.md b/docs/How-to-Upgrade-from-Standard-GAM.md index e18daf55..8e1d8e99 100644 --- a/docs/How-to-Upgrade-from-Standard-GAM.md +++ b/docs/How-to-Upgrade-from-Standard-GAM.md @@ -335,7 +335,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.77.07 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.77.08 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.12.4 64-bit final MacOS Sonoma 14.5 x86_64 @@ -1009,7 +1009,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.77.07 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.77.08 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.12.4 64-bit final Windows-10-10.0.17134 AMD64 diff --git a/docs/Version-and-Help.md b/docs/Version-and-Help.md index 5dbbdefb..41813718 100644 --- a/docs/Version-and-Help.md +++ b/docs/Version-and-Help.md @@ -3,7 +3,7 @@ Print the current version of Gam with details ``` gam version -GAMADV-XTD3 6.77.07 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.77.08 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.12.4 64-bit final MacOS Sonoma 14.5 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.77.07 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.77.08 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.12.4 64-bit final MacOS Sonoma 14.5 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.77.07 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource +GAMADV-XTD3 6.77.08 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource Ross Scroggs Python 3.12.4 64-bit final MacOS Sonoma 14.5 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.77.07 + Latest: 6.77.08 echo $? 1 ``` @@ -72,7 +72,7 @@ echo $? Print the current version number without details ``` gam version simple -6.77.07 +6.77.08 ``` 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.77.07 - https://github.com/taers232c/GAMADV-XTD3 +GAM 6.77.08 - https://github.com/taers232c/GAMADV-XTD3 Ross Scroggs Python 3.12.4 64-bit final MacOS Sonoma 14.5 x86_64 diff --git a/src/GamUpdate.txt b/src/GamUpdate.txt index 88c93378..05a6b439 100644 --- a/src/GamUpdate.txt +++ b/src/GamUpdate.txt @@ -2,6 +2,11 @@ Merged GAM-Team version +6.77.08 + +Fixed bugs in `gam delete chatmember ... group ` +and `gam delete chatmember ... groups ` that caused an error. + 6.77.07 Fixed bug in `gam create chatmember ... group ` that caused an error. diff --git a/src/gam/__init__.py b/src/gam/__init__.py index bf5db4f0..49765ad4 100755 --- a/src/gam/__init__.py +++ b/src/gam/__init__.py @@ -25731,6 +25731,12 @@ def _getChatMemberEmail(cd, member): _, memberUid = member['groupMember']['name'].split('/') member['groupMember']['email'], _ = convertUIDtoEmailAddressWithType(f'uid:{memberUid}', cd, None, emailTypes=['group']) +def normalizeUserMember(cd, user, userList): + userList.append(convertEmailAddressToUID(user, cd, emailType='user')) + +def normalizeGroupMember(cd, group, groupList): + groupList.append(convertEmailAddressToUID(group, cd, emailType='group')) + # gam create chatmember # [type human|bot] [role member|manager] # (user )* (members )* @@ -25742,12 +25748,6 @@ def _getChatMemberEmail(cd, member): # (group )* (groups )* # [formatjson|returnidonly] def createChatMember(users): - def normalizeUserMember(user): - userList.append(convertEmailAddressToUID(user, cd, emailType='user')) - - def normalizeGroupMember(group): - groupList.append(convertEmailAddressToUID(group, cd, emailType='group')) - def addMembers(members, field, entityType, i, count): jcount = len(members) entityPerformActionNumItems(kvList, jcount, entityType, i, count) @@ -25797,16 +25797,16 @@ def createChatMember(users): if myarg == 'space' or myarg.startswith('spaces/') or myarg.startswith('space/'): parent = getChatSpace(myarg) elif myarg == 'user': - normalizeUserMember(getEmailAddress(returnUIDprefix='uid:')) + normalizeUserMember(cd, getEmailAddress(returnUIDprefix='uid:'), userList) elif myarg in {'member', 'members'}: _, members = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS) for user in members: - normalizeUserMember(user) + normalizeUserMember(cd, user, userList) elif myarg == 'group': - normalizeGroupMember(getEmailAddress(returnUIDprefix='uid:')) + normalizeGroupMember(cd, getEmailAddress(returnUIDprefix='uid:'), groupList) elif myarg == 'groups': for group in getEntityList(Cmd.OB_GROUP_ENTITY): - normalizeGroupMember(group) + normalizeGroupMember(cd, group, groupList) elif myarg == 'role': role = getChoice(CHAT_MEMBER_ROLE_MAP, mapChoice=True) elif myarg == 'type': @@ -25887,7 +25887,8 @@ def deleteUpdateChatMember(users): parent = None body = {} memberNames = [] - userGroupList = [] + userList = [] + groupList = [] useAdminAccess, api, kwargsUAA = _getChatAdminAccess(API.CHAT_MEMBERSHIPS_ADMIN, API.CHAT_MEMBERSHIPS) while Cmd.ArgumentsRemaining(): myarg = getArgument() @@ -25903,14 +25904,16 @@ def deleteUpdateChatMember(users): if myarg == 'space' or myarg.startswith('spaces/') or myarg.startswith('space/'): parent = getChatSpace(myarg) elif myarg == 'user': - userGroupList.append(getEmailAddress(returnUIDprefix='uid:')) + normalizeUserMember(cd, getEmailAddress(returnUIDprefix='uid:'), userList) elif myarg in {'member', 'members'}: _, members = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS) - userGroupList.extend(members) + for user in members: + normalizeUserMember(cd, user, userList) elif deleteMode and myarg == 'group': - userGroupList.append(getEmailAddress(returnUIDprefix='uid:')) + normalizeGroupMember(cd, getEmailAddress(returnUIDprefix='uid:'), groupList) elif deleteMode and myarg == 'groups': - userGroupList.extend(getEntityList(Cmd.OB_GROUP_ENTITY)) + for group in getEntityList(Cmd.OB_GROUP_ENTITY): + normalizeGroupMember(cd, group, groupList) else: unknownArgumentExit() if not deleteMode and 'role' not in body: @@ -25921,11 +25924,12 @@ def deleteUpdateChatMember(users): else: # {Act.DELETE, Act.UPDATE} if not parent: missingArgumentExit('space') - if not userGroupList: + if not userList and not groupList: missingArgumentExit('user|members|group|groups') - for user in userGroupList: - name = normalizeEmailAddressOrUID(user) - memberNames.append(f'{parent}/members/{name}') + for user in userList: + memberNames.append(f'{parent}/members/{user}') + for group in groupList: + memberNames.append(f'{parent}/members/group-{group}') i, count, users = getEntityArgument(users) if useAdminAccess: _chkChatAdminAccess(count) @@ -26030,6 +26034,7 @@ def syncChatMembers(users): role = CHAT_MEMBER_ROLE_MAP['member'] mtype = CHAT_MEMBER_TYPE_MAP['human'] syncOperation = 'addremove' + kwargs = {} preview = False csvPF = None userList = [] @@ -26051,14 +26056,17 @@ def syncChatMembers(users): elif myarg == 'actioncsv': csvPF = CSVPrintFile(CHAT_SYNC_PREVIEW_TITLES) elif myarg == 'users': - userList.extend(getEntityList(Cmd.OB_USER_ENTITY)) + for user in getEntityList(Cmd.OB_USER_ENTITY): + normalizeUserMember(cd, user, userList) usersSpecified = True elif myarg in {'member', 'members'}: _, members = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS) - userList.extend(members) + for user in members: + normalizeUserMember(cd, user, userList) usersSpecified = True elif myarg == 'groups': - groupList.extend(getEntityList(Cmd.OB_GROUP_ENTITY)) + for group in getEntityList(Cmd.OB_GROUP_ENTITY): + normalizeGroupMember(cd, group, groupList) groupsSpecified = True else: unknownArgumentExit() @@ -26068,20 +26076,19 @@ def syncChatMembers(users): userMembers = {} syncUsersSet = set() for user in userList: - name = normalizeEmailAddressOrUID(user) - memberName = f'{parent}/members/{name}' - userMembers[memberName] = {'member': {'name': f'users/{name}', 'type': mtype}} + memberName = f'{parent}/members/{user}' + userMembers[memberName] = {'member': {'name': f'users/{user}', 'type': mtype}} syncUsersSet.add(memberName) groupMembers = {} syncGroupsSet = set() for group in groupList: - name = normalizeEmailAddressOrUID(group) - memberName = f'{parent}/members/{name}' - groupMembers[memberName] = {'groupMember': {'name': f'groups/{name}'}} + memberName = f'{parent}/members/group-{group}' + groupMembers[memberName] = {'groupMember': {'name': f'groups/{group}'}} syncGroupsSet.add(memberName) qfilter = f'{Ent.Singular(Ent.CHAT_SPACE)}: {parent}' i, count, users = getEntityArgument(users) if useAdminAccess: + kwargs['filter'] = 'member.type != "BOT"' _chkChatAdminAccess(count) for user in users: i += 1 @@ -26094,15 +26101,13 @@ def syncChatMembers(users): members = callGAPIpages(chat.spaces().members(), 'list', 'memberships', pageMessage=_getChatPageMessage(Ent.CHAT_MEMBER, user, i, count, qfilter), throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED], - pageSize=CHAT_PAGE_SIZE, parent=parent, showGroups=groupsSpecified, **kwargsUAA) + parent=parent, showGroups=groupsSpecified, pageSize=CHAT_PAGE_SIZE, **kwargs, **kwargsUAA) for member in members: if 'member' in member: if member['member']['type'] == mtype and member['role'] == role: - _getChatMemberEmail(cd, member) - currentUsersSet.add(f"{parent}/members/{member['member']['email']}") + currentUsersSet.add(member['name']) elif 'groupMember' in member: - _getChatMemberEmail(cd, member) - currentGroupsSet.add(f"{parent}/members/{member['groupMember']['email']}") + currentGroupsSet.add(member['name']) except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e: exitIfChatNotConfigured(chat, kvList, str(e), i, count) continue