@@ -379,6 +379,98 @@ def github_copilot(self) -> NoReturn:
379379 f'Пожалуйста, подождите { round (config .GITHUB_COPILOT_TIMEOUT - (now - self .now ))} секунд' , self .peer_id
380380 )
381381
382+ def upvote_previous (self ) -> NoReturn :
383+ """Upvotes the previous non-command message."""
384+ if self .peer_id < 2e9 or not self .karma_enabled :
385+ return
386+
387+ # Get recent conversation messages
388+ recent_messages = self .vk_instance .get_conversation_messages (self .peer_id , 20 )
389+
390+ # Find the previous non-command message
391+ current_msg_found = False
392+ for message in recent_messages :
393+ # Skip until we find current message
394+ if not current_msg_found :
395+ if message ["conversation_message_id" ] == self .msg_id :
396+ current_msg_found = True
397+ continue
398+
399+ # Skip messages from bots or system
400+ if message ["from_id" ] <= 0 :
401+ continue
402+
403+ message_text = message ["text" ].lstrip ("/" )
404+
405+ # Check if this message matches any command pattern
406+ is_command = False
407+ for cmd_pattern in Commands .cmds .keys ():
408+ if match (cmd_pattern , message_text ):
409+ is_command = True
410+ break
411+
412+ # If not a command, this is our target message
413+ if not is_command and message_text .strip ():
414+ target_user_id = message ["from_id" ]
415+ target_user = self .data_service .get_user (target_user_id , self .vk_instance )
416+
417+ # Don't allow self-upvote
418+ if target_user_id == self .from_id :
419+ self .vk_instance .send_msg (
420+ 'Нельзя голосовать за свои сообщения.' , self .peer_id )
421+ return
422+
423+ # Apply upvote (equivalent to +0 karma - collective vote)
424+ self .user = target_user
425+ utcnow = datetime .utcnow ()
426+
427+ # Check if already voted for this user
428+ if self .current_user .uid in target_user .supporters :
429+ self .vk_instance .send_msg (
430+ (f'Вы уже голосовали за [id{ target_user .uid } |'
431+ f'{ self .vk_instance .get_user_name (target_user .uid , "acc" )} ].' ),
432+ self .peer_id
433+ )
434+ return
435+
436+ # Check collective vote time limit
437+ utclast = datetime .fromtimestamp (
438+ float (self .current_user .last_collective_vote ))
439+ difference = utcnow - utclast
440+ hours_difference = difference .total_seconds () / 3600
441+ hours_limit = karma_limit (self .current_user .karma )
442+
443+ if hours_difference < hours_limit :
444+ self .vk_instance .delete_message (self .peer_id , self .msg_id )
445+ self .vk_instance .send_msg (
446+ CommandsBuilder .build_not_enough_hours (
447+ self .current_user , self .data_service ,
448+ hours_limit , difference .total_seconds () / 60 ),
449+ self .peer_id )
450+ return
451+
452+ # Apply the upvote
453+ user_karma_change , selected_user_karma_change , collective_vote_applied , voters = self .apply_karma_change (
454+ "+" , 0 )
455+
456+ if collective_vote_applied :
457+ self .current_user .last_collective_vote = int (utcnow .timestamp ())
458+ self .data_service .save_user (self .current_user )
459+
460+ if user_karma_change :
461+ self .data_service .save_user (target_user )
462+
463+ self .vk_instance .send_msg (
464+ CommandsBuilder .build_karma_change (
465+ user_karma_change , selected_user_karma_change , voters ),
466+ self .peer_id )
467+ self .vk_instance .delete_message (self .peer_id , self .msg_id )
468+ return
469+
470+ # No previous non-command message found
471+ self .vk_instance .send_msg (
472+ 'Не найдено предыдущее сообщение для голосования.' , self .peer_id )
473+
382474 def match_command (
383475 self ,
384476 pattern : Pattern
0 commit comments