mirror of
https://github.com/GAM-team/GAM.git
synced 2026-07-03 20:31:35 +00:00
Fix delete/sync chatmember group bugs
This commit is contained in:
@@ -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
|
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 <UserTypeEntity> delete chatmember <ChatSpace> ... group <GroupItem>`
|
||||||
|
and `gam <UserTypeEntity> delete chatmember <ChatSpace> ... groups <GroupEntity>` that caused an error.
|
||||||
|
|
||||||
### 6.77.07
|
### 6.77.07
|
||||||
|
|
||||||
Fixed bug in `gam <UserTypeEntity> create chatmember <ChatSpace> ... group <GroupItem>` that caused an error.
|
Fixed bug in `gam <UserTypeEntity> create chatmember <ChatSpace> ... group <GroupItem>` that caused an error.
|
||||||
|
|||||||
@@ -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$ rm -f /Users/admin/GAMConfig/oauth2.txt
|
||||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam version
|
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
|
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 <ross.scroggs@gmail.com>
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
Python 3.12.4 64-bit final
|
Python 3.12.4 64-bit final
|
||||||
MacOS Sonoma 14.5 x86_64
|
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>del C:\GAMConfig\oauth2.txt
|
||||||
C:\GAMADV-XTD3>gam version
|
C:\GAMADV-XTD3>gam version
|
||||||
WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found
|
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 <ross.scroggs@gmail.com>
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
Python 3.12.4 64-bit final
|
Python 3.12.4 64-bit final
|
||||||
Windows-10-10.0.17134 AMD64
|
Windows-10-10.0.17134 AMD64
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
Print the current version of Gam with details
|
Print the current version of Gam with details
|
||||||
```
|
```
|
||||||
gam version
|
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 <ross.scroggs@gmail.com>
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
Python 3.12.4 64-bit final
|
Python 3.12.4 64-bit final
|
||||||
MacOS Sonoma 14.5 x86_64
|
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
|
Print the current version of Gam with details and time offset information
|
||||||
```
|
```
|
||||||
gam version timeoffset
|
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 <ross.scroggs@gmail.com>
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
Python 3.12.4 64-bit final
|
Python 3.12.4 64-bit final
|
||||||
MacOS Sonoma 14.5 x86_64
|
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
|
Print the current version of Gam with extended details and SSL information
|
||||||
```
|
```
|
||||||
gam version extended
|
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 <ross.scroggs@gmail.com>
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
Python 3.12.4 64-bit final
|
Python 3.12.4 64-bit final
|
||||||
MacOS Sonoma 14.5 x86_64
|
MacOS Sonoma 14.5 x86_64
|
||||||
@@ -64,7 +64,7 @@ MacOS High Sierra 10.13.6 x86_64
|
|||||||
Path: /Users/Admin/bin/gamadv-xtd3
|
Path: /Users/Admin/bin/gamadv-xtd3
|
||||||
Version Check:
|
Version Check:
|
||||||
Current: 5.35.08
|
Current: 5.35.08
|
||||||
Latest: 6.77.07
|
Latest: 6.77.08
|
||||||
echo $?
|
echo $?
|
||||||
1
|
1
|
||||||
```
|
```
|
||||||
@@ -72,7 +72,7 @@ echo $?
|
|||||||
Print the current version number without details
|
Print the current version number without details
|
||||||
```
|
```
|
||||||
gam version simple
|
gam version simple
|
||||||
6.77.07
|
6.77.08
|
||||||
```
|
```
|
||||||
In Linux/MacOS you can do:
|
In Linux/MacOS you can do:
|
||||||
```
|
```
|
||||||
@@ -82,7 +82,7 @@ echo $VER
|
|||||||
Print the current version of Gam and address of this Wiki
|
Print the current version of Gam and address of this Wiki
|
||||||
```
|
```
|
||||||
gam help
|
gam help
|
||||||
GAM 6.77.07 - https://github.com/taers232c/GAMADV-XTD3
|
GAM 6.77.08 - https://github.com/taers232c/GAMADV-XTD3
|
||||||
Ross Scroggs <ross.scroggs@gmail.com>
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
Python 3.12.4 64-bit final
|
Python 3.12.4 64-bit final
|
||||||
MacOS Sonoma 14.5 x86_64
|
MacOS Sonoma 14.5 x86_64
|
||||||
|
|||||||
@@ -2,6 +2,11 @@
|
|||||||
|
|
||||||
Merged GAM-Team version
|
Merged GAM-Team version
|
||||||
|
|
||||||
|
6.77.08
|
||||||
|
|
||||||
|
Fixed bugs in `gam <UserTypeEntity> delete chatmember <ChatSpace> ... group <GroupItem>`
|
||||||
|
and `gam <UserTypeEntity> delete chatmember <ChatSpace> ... groups <GroupEntity>` that caused an error.
|
||||||
|
|
||||||
6.77.07
|
6.77.07
|
||||||
|
|
||||||
Fixed bug in `gam <UserTypeEntity> create chatmember <ChatSpace> ... group <GroupItem>` that caused an error.
|
Fixed bug in `gam <UserTypeEntity> create chatmember <ChatSpace> ... group <GroupItem>` that caused an error.
|
||||||
|
|||||||
@@ -25731,6 +25731,12 @@ def _getChatMemberEmail(cd, member):
|
|||||||
_, memberUid = member['groupMember']['name'].split('/')
|
_, memberUid = member['groupMember']['name'].split('/')
|
||||||
member['groupMember']['email'], _ = convertUIDtoEmailAddressWithType(f'uid:{memberUid}', cd, None, emailTypes=['group'])
|
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 <UserTypeEntity> create chatmember <ChatSpace>
|
# gam <UserTypeEntity> create chatmember <ChatSpace>
|
||||||
# [type human|bot] [role member|manager]
|
# [type human|bot] [role member|manager]
|
||||||
# (user <UserItem>)* (members <UserTypeEntity>)*
|
# (user <UserItem>)* (members <UserTypeEntity>)*
|
||||||
@@ -25742,12 +25748,6 @@ def _getChatMemberEmail(cd, member):
|
|||||||
# (group <GroupItem>)* (groups <GroupEntity>)*
|
# (group <GroupItem>)* (groups <GroupEntity>)*
|
||||||
# [formatjson|returnidonly]
|
# [formatjson|returnidonly]
|
||||||
def createChatMember(users):
|
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):
|
def addMembers(members, field, entityType, i, count):
|
||||||
jcount = len(members)
|
jcount = len(members)
|
||||||
entityPerformActionNumItems(kvList, jcount, entityType, i, count)
|
entityPerformActionNumItems(kvList, jcount, entityType, i, count)
|
||||||
@@ -25797,16 +25797,16 @@ def createChatMember(users):
|
|||||||
if myarg == 'space' or myarg.startswith('spaces/') or myarg.startswith('space/'):
|
if myarg == 'space' or myarg.startswith('spaces/') or myarg.startswith('space/'):
|
||||||
parent = getChatSpace(myarg)
|
parent = getChatSpace(myarg)
|
||||||
elif myarg == 'user':
|
elif myarg == 'user':
|
||||||
normalizeUserMember(getEmailAddress(returnUIDprefix='uid:'))
|
normalizeUserMember(cd, getEmailAddress(returnUIDprefix='uid:'), userList)
|
||||||
elif myarg in {'member', 'members'}:
|
elif myarg in {'member', 'members'}:
|
||||||
_, members = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS)
|
_, members = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS)
|
||||||
for user in members:
|
for user in members:
|
||||||
normalizeUserMember(user)
|
normalizeUserMember(cd, user, userList)
|
||||||
elif myarg == 'group':
|
elif myarg == 'group':
|
||||||
normalizeGroupMember(getEmailAddress(returnUIDprefix='uid:'))
|
normalizeGroupMember(cd, getEmailAddress(returnUIDprefix='uid:'), groupList)
|
||||||
elif myarg == 'groups':
|
elif myarg == 'groups':
|
||||||
for group in getEntityList(Cmd.OB_GROUP_ENTITY):
|
for group in getEntityList(Cmd.OB_GROUP_ENTITY):
|
||||||
normalizeGroupMember(group)
|
normalizeGroupMember(cd, group, groupList)
|
||||||
elif myarg == 'role':
|
elif myarg == 'role':
|
||||||
role = getChoice(CHAT_MEMBER_ROLE_MAP, mapChoice=True)
|
role = getChoice(CHAT_MEMBER_ROLE_MAP, mapChoice=True)
|
||||||
elif myarg == 'type':
|
elif myarg == 'type':
|
||||||
@@ -25887,7 +25887,8 @@ def deleteUpdateChatMember(users):
|
|||||||
parent = None
|
parent = None
|
||||||
body = {}
|
body = {}
|
||||||
memberNames = []
|
memberNames = []
|
||||||
userGroupList = []
|
userList = []
|
||||||
|
groupList = []
|
||||||
useAdminAccess, api, kwargsUAA = _getChatAdminAccess(API.CHAT_MEMBERSHIPS_ADMIN, API.CHAT_MEMBERSHIPS)
|
useAdminAccess, api, kwargsUAA = _getChatAdminAccess(API.CHAT_MEMBERSHIPS_ADMIN, API.CHAT_MEMBERSHIPS)
|
||||||
while Cmd.ArgumentsRemaining():
|
while Cmd.ArgumentsRemaining():
|
||||||
myarg = getArgument()
|
myarg = getArgument()
|
||||||
@@ -25903,14 +25904,16 @@ def deleteUpdateChatMember(users):
|
|||||||
if myarg == 'space' or myarg.startswith('spaces/') or myarg.startswith('space/'):
|
if myarg == 'space' or myarg.startswith('spaces/') or myarg.startswith('space/'):
|
||||||
parent = getChatSpace(myarg)
|
parent = getChatSpace(myarg)
|
||||||
elif myarg == 'user':
|
elif myarg == 'user':
|
||||||
userGroupList.append(getEmailAddress(returnUIDprefix='uid:'))
|
normalizeUserMember(cd, getEmailAddress(returnUIDprefix='uid:'), userList)
|
||||||
elif myarg in {'member', 'members'}:
|
elif myarg in {'member', 'members'}:
|
||||||
_, members = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS)
|
_, members = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS)
|
||||||
userGroupList.extend(members)
|
for user in members:
|
||||||
|
normalizeUserMember(cd, user, userList)
|
||||||
elif deleteMode and myarg == 'group':
|
elif deleteMode and myarg == 'group':
|
||||||
userGroupList.append(getEmailAddress(returnUIDprefix='uid:'))
|
normalizeGroupMember(cd, getEmailAddress(returnUIDprefix='uid:'), groupList)
|
||||||
elif deleteMode and myarg == 'groups':
|
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:
|
else:
|
||||||
unknownArgumentExit()
|
unknownArgumentExit()
|
||||||
if not deleteMode and 'role' not in body:
|
if not deleteMode and 'role' not in body:
|
||||||
@@ -25921,11 +25924,12 @@ def deleteUpdateChatMember(users):
|
|||||||
else: # {Act.DELETE, Act.UPDATE}
|
else: # {Act.DELETE, Act.UPDATE}
|
||||||
if not parent:
|
if not parent:
|
||||||
missingArgumentExit('space')
|
missingArgumentExit('space')
|
||||||
if not userGroupList:
|
if not userList and not groupList:
|
||||||
missingArgumentExit('user|members|group|groups')
|
missingArgumentExit('user|members|group|groups')
|
||||||
for user in userGroupList:
|
for user in userList:
|
||||||
name = normalizeEmailAddressOrUID(user)
|
memberNames.append(f'{parent}/members/{user}')
|
||||||
memberNames.append(f'{parent}/members/{name}')
|
for group in groupList:
|
||||||
|
memberNames.append(f'{parent}/members/group-{group}')
|
||||||
i, count, users = getEntityArgument(users)
|
i, count, users = getEntityArgument(users)
|
||||||
if useAdminAccess:
|
if useAdminAccess:
|
||||||
_chkChatAdminAccess(count)
|
_chkChatAdminAccess(count)
|
||||||
@@ -26030,6 +26034,7 @@ def syncChatMembers(users):
|
|||||||
role = CHAT_MEMBER_ROLE_MAP['member']
|
role = CHAT_MEMBER_ROLE_MAP['member']
|
||||||
mtype = CHAT_MEMBER_TYPE_MAP['human']
|
mtype = CHAT_MEMBER_TYPE_MAP['human']
|
||||||
syncOperation = 'addremove'
|
syncOperation = 'addremove'
|
||||||
|
kwargs = {}
|
||||||
preview = False
|
preview = False
|
||||||
csvPF = None
|
csvPF = None
|
||||||
userList = []
|
userList = []
|
||||||
@@ -26051,14 +26056,17 @@ def syncChatMembers(users):
|
|||||||
elif myarg == 'actioncsv':
|
elif myarg == 'actioncsv':
|
||||||
csvPF = CSVPrintFile(CHAT_SYNC_PREVIEW_TITLES)
|
csvPF = CSVPrintFile(CHAT_SYNC_PREVIEW_TITLES)
|
||||||
elif myarg == 'users':
|
elif myarg == 'users':
|
||||||
userList.extend(getEntityList(Cmd.OB_USER_ENTITY))
|
for user in getEntityList(Cmd.OB_USER_ENTITY):
|
||||||
|
normalizeUserMember(cd, user, userList)
|
||||||
usersSpecified = True
|
usersSpecified = True
|
||||||
elif myarg in {'member', 'members'}:
|
elif myarg in {'member', 'members'}:
|
||||||
_, members = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS)
|
_, members = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS)
|
||||||
userList.extend(members)
|
for user in members:
|
||||||
|
normalizeUserMember(cd, user, userList)
|
||||||
usersSpecified = True
|
usersSpecified = True
|
||||||
elif myarg == 'groups':
|
elif myarg == 'groups':
|
||||||
groupList.extend(getEntityList(Cmd.OB_GROUP_ENTITY))
|
for group in getEntityList(Cmd.OB_GROUP_ENTITY):
|
||||||
|
normalizeGroupMember(cd, group, groupList)
|
||||||
groupsSpecified = True
|
groupsSpecified = True
|
||||||
else:
|
else:
|
||||||
unknownArgumentExit()
|
unknownArgumentExit()
|
||||||
@@ -26068,20 +26076,19 @@ def syncChatMembers(users):
|
|||||||
userMembers = {}
|
userMembers = {}
|
||||||
syncUsersSet = set()
|
syncUsersSet = set()
|
||||||
for user in userList:
|
for user in userList:
|
||||||
name = normalizeEmailAddressOrUID(user)
|
memberName = f'{parent}/members/{user}'
|
||||||
memberName = f'{parent}/members/{name}'
|
userMembers[memberName] = {'member': {'name': f'users/{user}', 'type': mtype}}
|
||||||
userMembers[memberName] = {'member': {'name': f'users/{name}', 'type': mtype}}
|
|
||||||
syncUsersSet.add(memberName)
|
syncUsersSet.add(memberName)
|
||||||
groupMembers = {}
|
groupMembers = {}
|
||||||
syncGroupsSet = set()
|
syncGroupsSet = set()
|
||||||
for group in groupList:
|
for group in groupList:
|
||||||
name = normalizeEmailAddressOrUID(group)
|
memberName = f'{parent}/members/group-{group}'
|
||||||
memberName = f'{parent}/members/{name}'
|
groupMembers[memberName] = {'groupMember': {'name': f'groups/{group}'}}
|
||||||
groupMembers[memberName] = {'groupMember': {'name': f'groups/{name}'}}
|
|
||||||
syncGroupsSet.add(memberName)
|
syncGroupsSet.add(memberName)
|
||||||
qfilter = f'{Ent.Singular(Ent.CHAT_SPACE)}: {parent}'
|
qfilter = f'{Ent.Singular(Ent.CHAT_SPACE)}: {parent}'
|
||||||
i, count, users = getEntityArgument(users)
|
i, count, users = getEntityArgument(users)
|
||||||
if useAdminAccess:
|
if useAdminAccess:
|
||||||
|
kwargs['filter'] = 'member.type != "BOT"'
|
||||||
_chkChatAdminAccess(count)
|
_chkChatAdminAccess(count)
|
||||||
for user in users:
|
for user in users:
|
||||||
i += 1
|
i += 1
|
||||||
@@ -26094,15 +26101,13 @@ def syncChatMembers(users):
|
|||||||
members = callGAPIpages(chat.spaces().members(), 'list', 'memberships',
|
members = callGAPIpages(chat.spaces().members(), 'list', 'memberships',
|
||||||
pageMessage=_getChatPageMessage(Ent.CHAT_MEMBER, user, i, count, qfilter),
|
pageMessage=_getChatPageMessage(Ent.CHAT_MEMBER, user, i, count, qfilter),
|
||||||
throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
|
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:
|
for member in members:
|
||||||
if 'member' in member:
|
if 'member' in member:
|
||||||
if member['member']['type'] == mtype and member['role'] == role:
|
if member['member']['type'] == mtype and member['role'] == role:
|
||||||
_getChatMemberEmail(cd, member)
|
currentUsersSet.add(member['name'])
|
||||||
currentUsersSet.add(f"{parent}/members/{member['member']['email']}")
|
|
||||||
elif 'groupMember' in member:
|
elif 'groupMember' in member:
|
||||||
_getChatMemberEmail(cd, member)
|
currentGroupsSet.add(member['name'])
|
||||||
currentGroupsSet.add(f"{parent}/members/{member['groupMember']['email']}")
|
|
||||||
except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
|
except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
|
||||||
exitIfChatNotConfigured(chat, kvList, str(e), i, count)
|
exitIfChatNotConfigured(chat, kvList, str(e), i, count)
|
||||||
continue
|
continue
|
||||||
|
|||||||
Reference in New Issue
Block a user