praw-dev / praw

PRAW, an acronym for "Python Reddit API Wrapper", is a python package that allows for simple access to Reddit's API.

Home Page:http://praw.readthedocs.io/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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.