88
99import json
1010import logging
11- import threading
1211from dataclasses import dataclass
1312from datetime import datetime
1413from http .client import HTTPException
1514from socket import gethostname
1615from ssl import CertificateError
17- from time import sleep
18- from typing import NoReturn
16+ from time import time
1917from urllib .error import URLError
2018from urllib .request import Request , urlopen
2119
@@ -36,7 +34,6 @@ class CodeStats(Hook):
3634 user_name : str = gethostname ()
3735 url : str = "https://codestats.net/api/my/pulses"
3836 interval : int = 10 # interval at which stats are sent
39- sleep_interval : float = 0.1 # sleep interval for timeslicing
4037 timeout : int = 2 # request timeout value (in seconds)
4138
4239 def __post_init__ (
@@ -59,9 +56,7 @@ def __post_init__(
5956 raise NoKeyringError
6057
6158 self .xp_dict = {self .language_type : 0 }
62- self .sem = threading .Semaphore ()
63- self .thread = threading .Thread (target = self .run , daemon = True )
64- self .thread .start ()
59+ self .time = time ()
6560
6661 def __call__ (self , xp : int = 1 ) -> None :
6762 """Add xp.
@@ -72,26 +67,26 @@ def __call__(self, xp: int = 1) -> None:
7267 :type xp: int
7368 :rtype: None
7469 """
75- self .sem .acquire ()
7670 self .xp_dict [self .language_type ] += xp
77- self .sem .release ()
71+ if time () - self .time > self .interval :
72+ self .send_xp ()
73+ self .time = time ()
74+
75+ def __del__ (self ) -> None :
76+ self .send_xp ()
7877
7978 def send_xp (self ) -> None :
8079 """Send xp.
8180
82- Acquire the lock to get the list of xp to send.
83-
8481 :rtype: None
8582 """
8683 if len (self .xp_dict ) == 0 :
8784 return
8885
89- self .sem .acquire ()
9086 xp_list = [
9187 {"language" : ft , "xp" : xp } for ft , xp in self .xp_dict .items ()
9288 ]
9389 self .xp_dict = {self .language_type : 0 }
94- self .sem .release ()
9590
9691 # after lock is released we can send the payload
9792 utc_now = datetime .now ().astimezone ().isoformat ()
@@ -122,19 +117,3 @@ def send_xp(self) -> None:
122117 error = e
123118 if error :
124119 logger .error (error )
125-
126- def run (self ) -> NoReturn :
127- """Run main thread.
128-
129- Needs to be able to send XP at an interval.
130-
131- :param self:
132- :rtype: NoReturn
133- """
134- while True :
135- cur_time = 0
136- while cur_time < self .interval :
137- sleep (self .sleep_interval )
138- cur_time += self .sleep_interval
139-
140- self .send_xp ()
0 commit comments