o
    3Ypj                     @   s4   d dl Z d dlmZ defddZG dd dZdS )    N)datetimereturnc                   C   s   t  dS )Nz%Y-%m-%d %H:%M:%S)r   nowstrftime r   r   -/home/dore/onebot/Bot_Ero/core/db/activity.py_now   s   r   c                   @   s  e Zd Zdd Zd)ddZd)ddZ		d*d	efd
dZd	edB fddZ	d	edB fddZ
d	ee fddZd	ee fddZdd Zd	efddZd	efddZd	edB fddZd	ee fddZdd Zd d! Zd"eeeeef  fd#d$Zd	ee fd%d&Zd	edB fd'd(ZdS )+ActivityManagerc                 C   s   || _ tj| j _| | _d S N)connsqlite3Rowrow_factorycursorcur)selfr   r   r   r   __init__
   s   
zActivityManager.__init__r   c                 C   s"   | j || dd | j  D S )Nc                 S   s   g | ]}t |qS r   )dict).0rr   r   r   
<listcomp>   s    z)ActivityManager._rows.<locals>.<listcomp>)r   executefetchall)r   sqlparamsr   r   r   _rows   s   zActivityManager._rowsc                 C   s(   | j || | j  }|rt|S d S r
   )r   r   fetchoner   )r   r   r   r   r   r   r   _row   s   
zActivityManager._rowNr   c	           	      C   s<   | j dt||||t||||t f	 | j  | j jS )NzINSERT INTO activities (group_id, type, title, description, status, created_by, signup_deadline, deadline, hours_per_user, created_at) VALUES (?, ?, ?, ?, 'open', ?, ?, ?, ?, ?))r   r   intstrr   r   commit	lastrowid)	r   group_idtype_titledescription
created_byhours_per_userdeadlinesignup_deadliner   r   r   create_activity   s   

zActivityManager.create_activityc                 C      |  dt|fS )Nz%SELECT * FROM activities WHERE id = ?r   r   r   activity_idr   r   r   get_activity&   s   zActivityManager.get_activityc                 C   r+   )NzfSELECT * FROM activities WHERE group_id = ? AND status IN ('open', 'running') ORDER BY id DESC LIMIT 1r,   )r   r"   r   r   r   get_active_activity)      z#ActivityManager.get_active_activityc                 C   
   |  dS )NzLSELECT * FROM activities WHERE status IN ('open', 'running') ORDER BY id ASCr   r   r   r   r   get_active_activities0   s   z%ActivityManager.get_active_activitiesc                 C   r2   )Nz1SELECT * FROM activities WHERE status = 'running'r3   r4   r   r   r   get_running_activities6   s   
z&ActivityManager.get_running_activitiesc                 K   sR   |sd S d dd |D }| jd| dg | t|R  | j  d S )N, c                 s       | ]}| d V  qdS z = ?Nr   r   kr   r   r   	<genexpr><       z2ActivityManager.update_activity.<locals>.<genexpr>zUPDATE activities SET z WHERE id = ?)joinr   r   valuesr   r   r    )r   r.   fieldssetsr   r   r   update_activity9   s   
zActivityManager.update_activityc                 C   s2   | j dt|t||f | j  | j jdkS )NzXINSERT OR IGNORE INTO activity_members (activity_id, user_id, nickname) VALUES (?, ?, ?)r   )r   r   r   r   r   r    rowcount)r   r.   user_idnicknamer   r   r   
add_memberD   s   
zActivityManager.add_memberc                 C   s"   | j dt|f | j  d S )Nz;SELECT COUNT(*) FROM activity_members WHERE activity_id = ?r   )r   r   r   r   r-   r   r   r   count_membersM   s   
zActivityManager.count_membersc                 C      |  dt|t|fS )NzDSELECT * FROM activity_members WHERE activity_id = ? AND user_id = ?)r   r   r   r   r.   rD   r   r   r   
get_memberS   s   zActivityManager.get_memberc                 C   r+   )NzESELECT * FROM activity_members WHERE activity_id = ? ORDER BY seq ASC)r   r   r-   r   r   r   get_membersY   s   zActivityManager.get_membersc                 C   s(   | j dt|t|f | j  d S )NzBDELETE FROM activity_members WHERE activity_id = ? AND user_id = ?r   r   r   r   r   r    rI   r   r   r   remove_member_   s
   zActivityManager.remove_memberc                 K   sZ   |sd S d dd |D }| jd| dg | t|t|R  | j  d S )Nr7   c                 s   r8   r9   r   r:   r   r   r   r<   i   r=   z0ActivityManager.update_member.<locals>.<genexpr>zUPDATE activity_members SET z& WHERE activity_id = ? AND user_id = ?)r>   r   r   r?   r   r   r   r    )r   r.   rD   r@   rA   r   r   r   update_memberf   s   
zActivityManager.update_memberassignmentsc              	   C   s@   |D ]\}}}| j dt||t|t|f q| j  dS )uY   assignments: [(user_id, next_user_id, seq), ...] — 匹配环 / 接龙链一次写入。z[UPDATE activity_members SET seq = ?, next_user_id = ? WHERE activity_id = ? AND user_id = ?NrL   )r   r.   rO   uidnext_uidseqr   r   r   set_ringp   s   zActivityManager.set_ringc                 C   r+   )NzSELECT a.* FROM activities a JOIN activity_members m ON m.activity_id = a.id WHERE m.user_id = ? AND a.status = 'running' ORDER BY a.id DESC)r   r   )r   rD   r   r   r   get_running_activities_for_userz   r1   z/ActivityManager.get_running_activities_for_userc                 C   rH   )NzSELECT a.* FROM activities a JOIN activity_members m ON m.activity_id = a.id WHERE m.user_id = ? AND a.status = 'running' AND a.id = ?)r   r   r   )r   rD   r.   r   r   r   $get_running_activity_for_user_and_id   s   z4ActivityManager.get_running_activity_for_user_and_id)r   )NNN)__name__
__module____qualname__r   r   r   r   r*   r   r/   r0   listr5   r6   rB   boolrF   rG   rJ   rK   rM   rN   tupler   rS   rT   rU   r   r   r   r   r	   	   s.    


	

r	   )r   r   r   r   r	   r   r   r   r   <module>   s    