@@ -68,6 +68,14 @@ def save_init_chats_handler(c: Cardinal, e: InitialChatEvent):
6868 cardinal_tools .cache_old_users (c .old_users )
6969
7070
71+ def update_threshold_on_initial_chat (c : Cardinal , e : InitialChatEvent ):
72+ """
73+ Обновляет пороговое значение для определения новых чатов.
74+ """
75+ if e .chat .id > c .greeting_chat_id_threshold :
76+ c .greeting_chat_id_threshold = e .chat .id
77+
78+
7179# NEW MESSAGE / LAST CHAT MESSAGE CHANGED
7280def old_log_msg_handler (c : Cardinal , e : LastChatMessageChangedEvent ):
7381 """
@@ -106,6 +114,25 @@ def log_msg_handler(c: Cardinal, e: NewMessageEvent):
106114 MSG_LOG_LAST_STACK_ID = e .stack .id ()
107115
108116
117+ def update_threshold_on_last_message_change (c : Cardinal , e : LastChatMessageChangedEvent | NewMessageEvent ):
118+ """
119+ Обновляет пороговое значение для определения новых чатов.
120+ """
121+ # Должно выполняться после greetings_handler для корректной обработки
122+ # c.greeting_threshold_chat_ids (чтобы не спамило приветствиями)
123+ if not c .old_mode_enabled :
124+ if isinstance (e , LastChatMessageChangedEvent ):
125+ return
126+ chat_id = e .message .chat_id
127+ else :
128+ chat_id = e .chat .id
129+ if e .runner_tag != c .last_greeting_chat_id_threshold_change_tag :
130+ c .greeting_chat_id_threshold = max ([c .greeting_chat_id_threshold , * c .greeting_threshold_chat_ids ])
131+ c .greeting_threshold_chat_ids = set ()
132+ c .last_greeting_chat_id_threshold_change_tag = e .runner_tag
133+ c .greeting_threshold_chat_ids .add (chat_id )
134+
135+
109136def greetings_handler (c : Cardinal , e : NewMessageEvent | LastChatMessageChangedEvent ):
110137 """
111138 Отправляет приветственное сообщение.
@@ -120,8 +147,10 @@ def greetings_handler(c: Cardinal, e: NewMessageEvent | LastChatMessageChangedEv
120147 else :
121148 obj = e .chat
122149 chat_id , chat_name , mtype , its_me , badge = obj .id , obj .name , obj .last_message_type , not obj .unread , None
123- if any ([time .time () - c .old_users .get (chat_id , 0 ) < float (
124- c .MAIN_CFG ["Greetings" ]["greetingsCooldown" ]) * 24 * 60 * 60 ,
150+ if any ([c .MAIN_CFG ["Greetings" ].getboolean ("onlyNewChats" ) and
151+ (chat_id <= c .greeting_chat_id_threshold or chat_id in c .greeting_threshold_chat_ids ),
152+ time .time () - c .old_users .get (chat_id , 0 ) < float (
153+ c .MAIN_CFG ["Greetings" ]["greetingsCooldown" ]) * 24 * 60 * 60 ,
125154 its_me , mtype in (MessageTypes .DEAR_VENDORS , MessageTypes .ORDER_CONFIRMED_BY_ADMIN ), badge is not None ,
126155 (mtype is not MessageTypes .NON_SYSTEM and c .MAIN_CFG ["Greetings" ].getboolean ("ignoreSystemMessages" ))]):
127156 return
@@ -135,15 +164,19 @@ def add_old_user_handler(c: Cardinal, e: NewMessageEvent | LastChatMessageChange
135164 """
136165 Добавляет пользователя в список написавших.
137166 """
167+ if not c .MAIN_CFG ["Greetings" ].getboolean ("sendGreetings" ) or c .MAIN_CFG ["Greetings" ].getboolean ("onlyNewChats" ):
168+ return
169+
138170 if not c .old_mode_enabled :
139171 if isinstance (e , LastChatMessageChangedEvent ):
140172 return
141173 chat_id , mtype = e .message .chat_id , e .message .type
142174 else :
143175 chat_id , mtype = e .chat .id , e .chat .last_message_type
144176
145- if not c . MAIN_CFG [ "Greetings" ]. getboolean ( "sendGreetings" ) or mtype == MessageTypes .DEAR_VENDORS :
177+ if mtype == MessageTypes .DEAR_VENDORS :
146178 return
179+
147180 c .old_users [chat_id ] = int (time .time ())
148181 cardinal_tools .cache_old_users (c .old_users )
149182
@@ -506,13 +539,9 @@ def setup_event_attributes_handler(c: Cardinal, e: NewOrderEvent, *args):
506539 lot_description = e .order .description
507540 # пробуем найти лот, чтобы не выдавать по строке, которую вписал покупатель при оформлении заказа
508541 for lot in sorted (list (c .profile .get_sorted_lots (2 ).get (e .order .subcategory , {}).values ()),
509- key = lambda l : len (f"{ l .server } , { l .description } " ), reverse = True ):
510- if lot .server and lot .description :
511- temp_desc = f"{ lot .server } , { lot .description } "
512- elif lot .server :
513- temp_desc = lot .server
514- else :
515- temp_desc = lot .description
542+ key = lambda l : len (f"{ l .server } , { l .side } , { l .description } " ), reverse = True ):
543+
544+ temp_desc = ", " .join ([i for i in [lot .server , lot .side , lot .description ] if i ])
516545
517546 if temp_desc in e .order .description :
518547 lot_description = temp_desc
@@ -820,10 +849,11 @@ def send_bot_started_notification_handler(c: Cardinal, *args):
820849 continue
821850
822851
823- BIND_TO_INIT_MESSAGE = [save_init_chats_handler ]
852+ BIND_TO_INIT_MESSAGE = [save_init_chats_handler , update_threshold_on_initial_chat ]
824853
825854BIND_TO_LAST_CHAT_MESSAGE_CHANGED = [old_log_msg_handler ,
826855 greetings_handler ,
856+ update_threshold_on_last_message_change ,
827857 add_old_user_handler ,
828858 send_response_handler ,
829859 process_review_handler ,
@@ -833,6 +863,7 @@ def send_bot_started_notification_handler(c: Cardinal, *args):
833863
834864BIND_TO_NEW_MESSAGE = [log_msg_handler ,
835865 greetings_handler ,
866+ update_threshold_on_last_message_change ,
836867 add_old_user_handler ,
837868 send_response_handler ,
838869 process_review_handler ,
0 commit comments