В такой каше сложно разобраться. Но если я правильно понимаю, ты пытаешься проверить несуществующий атрибут:
Выдаёт ошибку: if (msg.from_user is None and msg.forward_from_chat.id == public.id):
AttributeError: ‘NoneType’ object has no attribute ‘I’d’
Из твоего кода:
if (msg.from_user is None) # если сообщение не имеет автора
# и это репост из паблика (проверка по id)
Это так не работает. Если нет автора, то такого атрибута нет вообще, эта часть не работает. Вот тебе пример на Pyrogram как из сообщения вытащить ID.
any_sender_id = message.from_user.id if message.from_user else message.sender_chat.id #вытаскиваем ID
if any_sender_id == public.id: #проверяем что это нужный паблик
#дальше твоя логика
Если сообщение "from_user", значит принимает его ID. Иначе - принимает ID чата/канала.
этот же код чуть понятнее:
any_sender_id = None #объявляем переменную для хранения ID
if message.from_user: #если у нас есть параметр from_user
any_sender_id = message.from_user.id #присваеваем ID юзера
else: #иначе
any_sender_id = message.sender_chat.id #присваеваем ID канала или чата
if any_sender_id == public.id: #проверяем что это нужный паблик
#дальше твоя логика