@@ -12,45 +12,42 @@ class User(SQLModel, table=True):
12
12
user_id : str = Field (primary_key = True )
13
13
year : int
14
14
month : int
15
- mask : str = "0"
15
+ mask : int = 0
16
16
17
17
# Async engine
18
18
engin : AsyncEngine = create_async_engine (DATABASE_URL )
19
19
initialized : bool = False
20
20
21
21
# Attendance
22
22
def get_seq (mask : int ) -> list [int ]:
23
- return list (
24
- map (
25
- lambda x : x [0 ] + 1 ,
26
- filter (
27
- lambda x : x [1 ] == '1' ,
28
- enumerate (bin (mask )[2 :][::- 1 ])
29
- )
30
- )
31
- )
23
+ ret : list [int ] = []
24
+ while mask > 0 :
25
+ lb : int = mask & - mask
26
+ mask -= lb
27
+ ret .append (lb .bit_length ())
28
+
29
+ return ret
32
30
33
31
async def attend (now : datetime , user_id : str ) -> tuple [bool , Sequence [int ]]:
34
32
if not initialized :
35
33
async with engin .begin () as conn :
36
34
await conn .run_sync (SQLModel .metadata .create_all )
37
-
35
+
38
36
async with AsyncSession (engin ) as session :
39
37
user : User | None = (
40
38
await session .exec (select (User ).where (User .user_id == user_id ))
41
39
).one_or_none ()
42
40
43
41
if user == None or user .year != now .year or user .month != now .month :
44
42
user = User (user_id = user_id , year = now .year , month = now .month )
45
-
46
- mask : int = int (user .mask )
47
- if (mask >> (now .day - 1 )) & 1 == 1 :
48
- return (False , get_seq (mask ))
43
+
44
+ if (user .mask >> (now .day - 1 )) & 1 == 1 :
45
+ return (False , get_seq (user .mask ))
49
46
else :
50
- mask |= (1 << (now .day - 1 ))
51
- user .mask = str (mask )
47
+ user .mask |= (1 << (now .day - 1 ))
52
48
53
49
session .add (user )
54
50
await session .commit ()
51
+ await session .refresh (user )
55
52
56
- return (True , get_seq (mask ))
53
+ return (True , get_seq (user . mask ))
0 commit comments