Modmail Conversations throw a TypeError when issuing a reply
adhesivecheese opened this issue · comments
Describe the Bug
A TypeError is thrown for a modmail conversation if leaving an internal reply. The code we've been using to do this has been in place for months; the first observed error was at 2023-07-10 14:16:32 UTC
This appears to occur whether the reply is internal or to the user.
It is worth noting that the reply goes through; the error occurs after submitting the reply.
Desired Result
A new modmail conversation is created, then an internal moderator note is left.
Code to reproduce the bug
testingSub = "" #your subreddit name
testingUser = "" #the user you're sending the modmail to
conversation = reddit.subreddit(testingSub).modmail.create(subject="test", body="testing", recipient=testingUser, author_hidden=True)
conversation.reply(internal=True, body="additional test") #this is where the error happens
The Reddit()
initialization in my code example does not include the following parameters to prevent credential leakage:
client_secret
, password
, or refresh_token
.
- Yes
Relevant Logs
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in test
File "/<redacted>/lib/python3.8/site-packages/praw/util/deprecate_args.py", line 43, in wrapped
return func(**dict(zip(_old_args, args)), **kwargs)
File "/<redacted>/lib/python3.8/site-packages/praw/models/reddit/modmail.py", line 265, in reply
message_id = response["conversation"]["objIds"][-1]["id"]
This code has previously worked as intended.
Yes
Operating System/Environment
Ubuntu 20.04.4 (WSL), almalinux8
Python Version
3.8.10, 3.9.13
PRAW Version
3.7
Prawcore Version
2.3.0
Anything else?
No response
Could you include the the full exception?
Oh whoops, realized I missed the last line. Went ahead and ran this on my non personal account so I don't have to redact the path, as well:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/dppmods/testing/.venv/lib/python3.9/site-packages/praw/util/deprecate_args.py", line 43, in wrapped
return func(**dict(zip(_old_args, args)), **kwargs)
File "/home/dppmods/testing/.venv/lib/python3.9/site-packages/praw/models/reddit/modmail.py", line 265, in reply
message_id = response["conversation"]["objIds"][-1]["id"]
TypeError: 'ModmailConversation' object is not subscriptable
Just to confirm this used to work? This is likely a change with how Reddit is returning data. By looking at the exception it seems like the serializer is objectifying things too soon.
Yep. This code's been working reliably 30+ times a day since (at least) March.
Then yeah this is Reddit making a breaking change. Again. I'll dig deeper into it and see if I can get it working.
This only happens with internal messages? Can you find cases where it works as intended?
External replies as well, per recent brief testing. I'll have a think about other possible test-cases and report back should I think of anything.
So any reply is broken? Interesting. That makes this more severe. If replying is completely broken then this needs reported to Reddit.
The replies go through just fine, to be clear; it looks like it's just sending different data than praw expects back.
Weighing in - all seeing this error. Have been using reply() to modmail for years+ and reddit broke it within the past few days. The reply is sent but an exception is generated
derp
"all seeing this error" = also seeing this error
@spitrespectable if you also archive your messages after reply by bot and this breaks that, in the interrum I've found that, since the reply does get sent, you can wrap it in a try/except to be able to still archive modmails
try: conversation.reply(<reply stuff here>)
except: pass
conversation.archive()
This should be fixed now. Releasing to PyPi now.