
    >i>                        d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlmZmZ d dlmZmZmZmZ d dlmZmZ e	rd dlmZ  ej0                  e      Z ed	
       G d d             Z G d d      ZeZy)    )annotationsN)	dataclass)TYPE_CHECKINGOptional)InputCommandsRuntimeCommands)	bezier_2dfitts_durationminimum_jerkrandom_control_points)MouseButtonMouseEventType)TabT)frozenc                     e Zd ZU dZdZded<   dZded<   dZded<   d	Zded
<   dZ	ded<   dZ
ded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded <   dZded!<   dZded"<   dZded#<   dZded$<   d%Zded&<   dZded'<   dZded(<   dZded)<   dZded*<   d+Zded,<   d-Zded.<   d%Zded/<   d0Z ded1<   y2)3MouseTimingConfigz3Configuration for realistic mouse movement physics.gQ?floatfitts_a333333?fitts_bg~jt?frame_intervalgMbp?frame_interval_varianceg?curvature_ming333333?curvature_maxg333333?curvature_asymmetryg      I@short_distance_threshold      ?tremor_amplitudegffffff?overshoot_probabilitygQ?overshoot_distance_mingQ?overshoot_distance_maxg      i@overshoot_speed_thresholdg?pre_click_pause_min皙?pre_click_pause_maxclick_hold_minclick_hold_maxdouble_click_interval_mindouble_click_interval_maxg{Gz?drag_start_pause_mindrag_start_pause_maxdrag_end_pause_mindrag_end_pause_maxmicro_pause_probabilitygQ?micro_pause_ming{Gz?micro_pause_maxmin_durationg      @max_durationN)!__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2        _/var/www/python/tenders/Scrapper/venv/lib/python3.12/site-packages/pydoll/interactions/mouse.pyr   r      s.   =GUGU!NE!%*U*M5M5!$$&*e*!e!#'5'$(E($(E(',u,!%%!%% NE  NE '+u+'+u+"&%&"&%& $$ $$%)U)"OU"!OU!L%L%r9   r   c                  r   e Zd ZdZdZdZ	 	 d	 	 	 	 	 d dZed!d       Zej                  d"d       Zed#d	       Z
e
j                  d$d
       Z
dd	 	 	 	 	 	 	 d%dZej                  ddd	 	 	 	 	 	 	 	 	 	 	 d&dZej                  dd	 	 	 	 	 	 	 	 	 d'dZej                  fd(dZej                  fd(dZdd	 	 	 	 	 	 	 	 	 	 	 d)dZd*dZ	 	 	 	 	 	 	 	 d+dZ	 	 	 	 	 	 	 	 	 	 	 	 d,dZe	 	 	 	 	 	 	 	 	 	 	 	 d-d       Z	 	 	 	 	 	 	 	 	 	 d.dZ	 	 	 	 	 	 	 	 	 	 d/dZ	 	 	 	 	 	 d0dZd1dZ	 d2	 	 	 	 	 	 	 d3dZd4dZy)5Mousea?  
    Mouse input controller with realistic humanized simulation.

    Provides methods for mouse movement, clicking, double-clicking,
    and dragging with optional humanized simulation using Bezier curves,
    Fitts's Law timing, minimum-jerk velocity profiles, physiological
    tremor, and overshoot correction.
    a  
    (() => {
        if (document.getElementById('__pydoll_mouse_debug')) return;
        const canvas = document.createElement('canvas');
        canvas.id = '__pydoll_mouse_debug';
        canvas.style.cssText = 'position:fixed;top:0;left:0;width:100vw;height:100vh;'
            + 'pointer-events:none;z-index:2147483647;';
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
        document.body.appendChild(canvas);
        window.__pydoll_debug_ctx = canvas.getContext('2d');
    })();
    z
    (() => {{
        const ctx = window.__pydoll_debug_ctx;
        if (!ctx) return;
        ctx.beginPath();
        ctx.arc({x}, {y}, {radius}, 0, 2 * Math.PI);
        ctx.fillStyle = '{color}';
        ctx.fill();
    }})();
    NFc                b    || _         |xs
 t               | _        d| _        || _        d| _        y)a  
        Initialize mouse controller.

        Args:
            tab: Tab instance to execute mouse commands on.
            timing: Optional custom timing configuration for humanized movement.
            debug: Draw colored dots on the page to visualize mouse path.
        )        r>   FN)_tabr   _timing	_position_debug_debug_initialized)selftabtimingdebugs       r:   __init__zMouse.__init__f   s1     	4!2!4.8"'r9   c                    | j                   S )z4Current timing configuration for humanized movement.r@   rD   s    r:   rF   zMouse.timingz   s     ||r9   c                    || _         y)zReplace the timing configuration.

        Args:
            config: New MouseTimingConfig to use for future operations.
        NrJ   )rD   configs     r:   rF   zMouse.timing   s     r9   c                    | j                   S )z'Whether to draw debug dots on the page.)rB   rK   s    r:   rG   zMouse.debug   s     {{r9   c                     || _         d| _        y)z+Set whether to draw debug dots on the page.FN)rB   rC   )rD   values     r:   rG   zMouse.debug   s     "'r9   )humanizec                  K   |r| j                  ||       d{    y| j                  ||       d{    y7  7 w)z
        Move mouse cursor to the specified position.

        Args:
            x: Target X coordinate (CSS pixels).
            y: Target Y coordinate (CSS pixels).
            humanize: Simulate human-like curved movement with natural timing.
        N)_move_humanized_dispatch_move)rD   xyrQ   s       r:   movez
Mouse.move   sE      &&q!,,,!!!Q''' - 	(s   ?;?=??   buttonclick_countrQ   c               2  K   |r| j                  ||||       d{    y| j                  ||       d{    | j                  t        j                  ||       d{    | j                  t        j
                  ||       d{    y7 r7 Y7 27 w)aS  
        Click at the specified position.

        Args:
            x: Target X coordinate (CSS pixels).
            y: Target Y coordinate (CSS pixels).
            button: Mouse button to click.
            click_count: Number of clicks (2 for double-click).
            humanize: Simulate human-like movement and click timing.
        N)_click_humanizedrT   _dispatch_buttonr   MOUSE_PRESSEDMOUSE_RELEASED)rD   rU   rV   rZ   r[   rQ   s         r:   clickzMouse.click   s     & ''1fkBBB!!!Q'''##N$@$@&+VVV##N$A$A6;WWW C 	(VWsC   BBBB(B B!(B	B
BBBB)rZ   rQ   c               L   K   | j                  |||d|       d{    y7 w)a  
        Double-click at the specified position.

        Args:
            x: Target X coordinate (CSS pixels).
            y: Target Y coordinate (CSS pixels).
            button: Mouse button to click.
            humanize: Simulate human-like movement and click timing.
           rY   N)ra   )rD   rU   rV   rZ   rQ   s        r:   double_clickzMouse.double_click   s$     " jjAf!hjOOOs   $"$c                `   K   | j                  t        j                  |       d{    y7 w)z|
        Press mouse button down at the current position.

        Args:
            button: Mouse button to press.
        N)r^   r   r_   rD   rZ   s     r:   downz
Mouse.down   s$      ##N$@$@&III   $.,.c                `   K   | j                  t        j                  |       d{    y7 w)z{
        Release mouse button at the current position.

        Args:
            button: Mouse button to release.
        N)r^   r   r`   rf   s     r:   upzMouse.up   s$      ##N$A$A6JJJrh   c                 K   |r| j                  ||||       d{    y| j                  ||       d{    | j                  t        j                  t
        j                         d{    | j                  ||       d{    | j                  t        j                  t
        j                         d{    y7 7 7 Y7 A7 w)a  
        Drag from one position to another.

        Args:
            start_x: Start X coordinate.
            start_y: Start Y coordinate.
            end_x: End X coordinate.
            end_y: End Y coordinate.
            humanize: Simulate human-like drag movement.
        N)_drag_humanizedrT   r^   r   r_   r   LEFTr`   )rD   start_xstart_yend_xend_yrQ   s         r:   dragz
Mouse.drag   s     & &&wFFF!!'7333##N$@$@+BRBRSSS!!%///##N$A$A;CSCSTTT G 	4S/TsU   CCCC5C-C.CC	5C=C>CCC	CCc                  K   | j                   }||f}t        j                  ||d   z
  ||d   z
        }|dk  r| j                  ||       d{    y| j                  }t        |d|j                  |j                        }t        |j                  t        ||j                              }||j                  kD  xr! t        j                         |j                  k  }|r| j                  |||       d{    n2| j!                  ||      \  }	}
| j#                  ||||	|
       d{    | j                  ||       d{    y7 7 T7 #7 w)zEMove mouse with realistic curved path, timing, tremor, and overshoot.r   rX   r   N      4@)rA   mathhypotrT   r@   r
   r   r   maxr1   minr2   r"   randomr   _move_with_overshoot_get_control_points_perform_movement_loop)rD   target_xtarget_ystarttargetdistancerM   durationshould_overshootcp1cp2s              r:   rS   zMouse._move_humanized  sE    H%::hq18eAh3FGc>%%h999!(D&..&..Qv**C&:M:M,NO v777 ?&">">> 	
 ++E68DDD//v>HC--eVXsCPPP!!(H555% : E Q5sI   AEE
B'E7E82E*E+EEEEEEc                  K   | j                   }t        j                  |j                  |j                        }|d   |d   z
  }|d   |d   z
  }|d   ||z  z   |d   ||z  z   f}| j                  ||      \  }	}
| j                  |||dz  |	|
       d{    | j                  ||      \  }	}
| j                  |||dz  |	|
       d{    y7 :7 w)z=Execute a movement that overshoots the target, then corrects.r   rX   g333333?Nr   )r@   ry   uniformr    r!   r{   r|   )rD   r   r   r   rM   overshoot_fractiondxdy	overshootr   r   s              r:   rz   zMouse._move_with_overshoot  s      #^^))6+H+H
 AYq!AYq!AY&8!88&)bK]F]:]^	++E9=S))%HtOSRUVVV++Iv>S)))VX_cSVWWW 	W 	Xs$   BCC4C
CCCc                l  K   | j                   }t        j                         }|j                         }|d   |d   |f}		 |j                         }
|
|z
  }||k\  ryt	        ||z        }t        |||||      \  }}| j                  |||
|	|      }|t        j                  d|      z  }|t        j                  d|      z  }| j                  ||       d{    |||
f}	|j                  t        j                  |j                   |j                        z   }t        j                  t        d|             d{    t        j                         |j                  k  rLt        j                  |j                   |j"                        }t        j                  |       d{    ||z  }o7 7 u7 w)zLExecute the frame-by-frame movement loop using Bezier path and minimum jerk.r   rX   NgMbP?)r@   asyncioget_running_looptimer   r	   _compute_tremor_sigmary   gaussrT   r   r   r   sleeprw   r.   r/   r0   )rD   r   endr   r   r   rM   loop
start_timeprevnowelapsedtrU   rV   sigmaframe_delaypauses                     r:   r|   zMouse._perform_movement_loop4  s     '')YY[
a%(J/))+CJ&G("Wx/0AQsC5DAq..q!S$GEa''Aa''A%%a+++q#;D //&..///1O1O3 K --E; 7888}}!?!??v'='=v?U?UVmmE***e#
3  , 9 +s8   CF4F.A#F4:F0;A'F4"F2#F40F42F4c                    ||d   z
  }|dkD  r8t        j                  | |d   z
  ||d   z
        |z  }t        dd|dz  z
        }nd}|j                  |z  S )z?Compute tremor amplitude scaled inversely with cursor velocity.rc   r   rX   r$   r   g     @@)ru   rv   rw   r   )rU   rV   r   r   rM   dtvelocityspeed_factors           r:   r   zMouse._compute_tremor_sigma]  si     47]6zz!d1g+q47{;b@HsC(U*:$:;LL&&55r9   c                  K   | j                   }| j                  ||       d{    t        j                  |j                  |j
                        }t        j                  |       d{    t        |      D ]  }|dz   }| j                  t        j                  ||       d{    t        j                  |j                  |j                        }	t        j                  |	       d{    | j                  t        j                  ||       d{    ||k  st        j                  |j                  |j                         }
t        j                  |
       d{     y7 H7 7 7 7 ^7 w)z)Click with realistic movement and timing.NrX   )r@   rS   ry   r   r#   r%   r   r   ranger^   r   r_   r&   r'   r`   r(   r)   )rD   rU   rV   rZ   r[   rM   	pre_pauseicurrent_countholdintervals              r:   r]   zMouse._click_humanizedn  s:     ""1a(((NN6#=#=v?Y?YZ	mmI&&&{# 	.AEM''(D(Dfm\\\>>&"7"79N9NOD--%%%''(E(Ev}]]]{*!>>4444 mmH---	. 	) 	' ] &] .sr   "E:E,AE:+E/,;E:'E2(AE:.E4/(E:E6	E:"AE:$E8%E:/E:2E:4E:6E:8E:c                  K   | j                   }| j                  ||       d{    | j                  t        j                  t
        j                         d{    t        j                  |j                  |j                        }t        j                  |       d{    | j                  }t        j                  ||d   z
  ||d   z
        }t!        |d|j"                  |j$                        }	t'        |j(                  t+        |	|j,                              }	| j/                  |||f      \  }
}| j1                  |||f|	|
|       d{    | j3                  ||       d{    t        j                  |j4                  |j6                        }t        j                  |       d{    | j                  t        j8                  t
        j                         d{    y7 7 7 S7 7 7 H7 w)z1Drag with realistic movement, pauses, and timing.Nr   rX   rt   )r@   rS   r^   r   r_   r   rm   ry   r   r*   r+   r   r   rA   ru   rv   r
   r   r   rw   r1   rx   r2   r{   r|   rT   r,   r-   r`   )rD   rn   ro   rp   rq   rM   drag_start_pauser   r   r   r   r   drag_end_pauses                r:   rl   zMouse._drag_humanized  s     ""7G444##N$@$@+BRBRSSS!>>&*E*EvGbGbcmm,---::eeAh.a0@A!(D&..&..Qv**C&:M:M,NO++EE5>BS))%%3PSTTT!!%///(A(A6C\C\]mmN+++##N$A$A;CSCSTTT% 	5S 	. 	U/ 	,Ts~   "G?G.5G?G1AG?!G4"B/G?G7G?+G9,AG?2G;35G?(G=)G?1G?4G?7G?9G?;G?=G?c                    | j                   }t        |||j                  |j                  |j                  |j
                        S )z;Generate Bezier control points using current timing config.)r@   r   r   r   r   r   )rD   r   r   rM   s       r:   r{   zMouse._get_control_points  sD     $    &&++
 	
r9   c           	     T  K   t        j                  t        j                  t	        t        |            t	        t        |                  }| j                  j                  |       d{    ||f| _        | j                  r| j                  ||dd       d{    yy7 87 w)z9Dispatch a mouseMoved event and update internal position.)typerU   rV   Nrc   zrgba(0,150,255,0.6)radiuscolor)r   dispatch_mouse_eventr   MOUSE_MOVEDintroundr?   _execute_commandrA   rB   _debug_draw_dot)rD   rU   rV   commands       r:   rT   zMouse._dispatch_move  s     44++%(m%(m

 ii((111Q;;&&q!A=R&SSS  	2 Ts$   A)B(+B$,1B(B&B(&B(c           
       K   t        j                  |t        t        | j                  d               t        t        | j                  d               ||      }| j
                  j                  |       d{    | j                  rL|t        j                  k(  r8| j                  | j                  d   | j                  d   dd       d{    yyy7 ]7 	w)z;Dispatch mousePressed or mouseReleased at current position.r   rX   )r   rU   rV   rZ   r[   N   zrgba(255,50,50,0.9)r   )r   r   r   r   rA   r?   r   rB   r   r_   r   )rD   
event_typerZ   r[   r   s        r:   r^   zMouse._dispatch_button  s       44%q)*+%q)*+#
 ii((111;;:)E)EE&&q!4>>!#4QF[ '    F; 	2s%   A7C9C:ACCCCc                  K   | j                   sG| j                  j                  t        j                  | j
                               d{    d| _         | j                  j                  t        t        |            t        t        |            ||      }| j                  j                  t        j                  |             d{    y7 7 w)z,Draw a debug dot on the page overlay canvas.NT)rU   rV   r   r   )
rC   r?   r   r   evaluate_DEBUG_INIT_JS_DEBUG_DOT_JSformatr   r   )rD   rU   rV   r   r   scripts         r:   r   zMouse._debug_draw_dot  s     &&)),,_-E-EdFYFY-Z[[[&*D###**%(ms58}V5 + 
 ii(()A)A&)IJJJ \ 	Ks%   AC
CA?C
CCC)NF)rE   r   rF   zOptional[MouseTimingConfig]rG   bool)returnr   )rM   r   r   None)r   r   )rP   r   r   r   )rU   r   rV   r   rQ   r   r   r   )rU   r   rV   r   rZ   r   r[   r   rQ   r   r   r   )
rU   r   rV   r   rZ   r   rQ   r   r   r   )rZ   r   r   r   )rn   r   ro   r   rp   r   rq   r   rQ   r   r   r   )r}   r   r~   r   r   r   )r   tuple[float, float]r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   )rU   r   rV   r   r   r   r   ztuple[float, float, float]rM   r   r   r   )
rU   r   rV   r   rZ   r   r[   r   r   r   )
rn   r   ro   r   rp   r   rq   r   r   r   )r   r   r   r   r   z/tuple[tuple[float, float], tuple[float, float]])rU   r   rV   r   r   r   )rX   )r   r   rZ   r   r[   r   r   r   )
rU   r   rV   r   r   r   r   strr   r   )r3   r4   r5   r6   r   r   rH   propertyrF   setterrG   rW   r   rm   ra   rd   rg   rj   rr   rS   rz   r|   staticmethodr   r]   rl   r{   rT   r^   r   r8   r9   r:   r<   r<   C   sb   N	M /3	(( ,( 	((   ]]    \\( ( (( (
 ( 
(4 *..XX X
 X X X 
X@ *..PP P
 P P 
P& 0;/?/? J .9-=-= K  UU U 	U
 U U 
U866X"X $X 	X
 
X*'$"'$ !'$ 	'$
 !'$ !'$ 
'$R 666 6 )	6
 "6 
6 6 .. . 	.
 . 
.>UU U 	U
 U 
U<
"
 !
 
9	
 T" 	"  	
 
*	Kr9   r<   )
__future__r   r   loggingru   ry   dataclassesr   typingr   r   pydoll.commandsr   r   pydoll.interactions.utilsr	   r
   r   r   pydoll.protocol.input.typesr   r   pydoll.browser.tabr   	getLoggerr3   loggerr   r<   MouseAPIr8   r9   r:   <module>r      sz    "     ! * :  D&			8	$ $& & &RcK cKL r9   