praw-dev / praw

PRAW, an acronym for "Python Reddit API Wrapper", is a python package that allows for simple access to Reddit's API.
http://praw.readthedocs.io/
BSD 2-Clause "Simplified" License
3.4k stars 453 forks source link

Modmail Conversations throw a TypeError when issuing a reply #1959

Closed adhesivecheese closed 1 year ago

adhesivecheese commented 1 year ago

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.

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

LilSpazJoekp commented 1 year ago

Could you include the the full exception?

adhesivecheese commented 1 year ago

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
LilSpazJoekp commented 1 year ago

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.

adhesivecheese commented 1 year ago

Yep. This code's been working reliably 30+ times a day since (at least) March.

LilSpazJoekp commented 1 year ago

Then yeah this is Reddit making a breaking change. Again. I'll dig deeper into it and see if I can get it working.

LilSpazJoekp commented 1 year ago

This only happens with internal messages? Can you find cases where it works as intended?

adhesivecheese commented 1 year ago

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.

LilSpazJoekp commented 1 year ago

So any reply is broken? Interesting. That makes this more severe. If replying is completely broken then this needs reported to Reddit.

adhesivecheese commented 1 year ago

The replies go through just fine, to be clear; it looks like it's just sending different data than praw expects back.

spitrespectable commented 1 year ago

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

spitrespectable commented 1 year ago

derp

"all seeing this error" = also seeing this error

adhesivecheese commented 1 year ago

@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()
LilSpazJoekp commented 1 year ago

This should be fixed now. Releasing to PyPi now.