Comp sec: Act 9

 avatar
unknown
python
4 years ago
3.9 kB
7
Indexable
import time
import threading
import pandas as pd
from pynput.keyboard import Key, KeyCode, Listener
from sklearn.neighbors import KNeighborsClassifier

REFRESH_RATE = 24
class Main:
    def __init__(self):
        self.mem: list[tuple[str, float]] = []
        self.index: int = 0
        self.word: str = ""
        self.word_len: int = 0
        self.run = False
        self.div = True
    
    def loop(self):
        count = 0
        while self.run:
            time.sleep(1/REFRESH_RATE)
            self.div = count < REFRESH_RATE//2
            if count == REFRESH_RATE: count = 0
            self.display()
            count += 1
    
    def start(self, word):
        self.mem = []
        self.index = 0
        self.word = word
        self.word_len = len(word)
        self.run = True
        t = threading.Thread(target=self.loop)
        t.start()
        start = time.perf_counter()
        with Listener(on_press=self.pressed, on_release=self.released) as detector:
            self.cls()
            print(word)
            print()
            self.cls()
            detector.join()
        t.join()
        return [(*x[:-1], round(x[-1]-start, 7)) for x in self.mem]
    
    def register_char(self, char: str):
        if self.index < self.word_len and self.word[self.index] == char:
            prev_char = self.word[self.index - 1] if self.index - 1 >= 0 else ""
            self.mem.append((prev_char, char, time.perf_counter()))
            self.index+=1
    
    def display(self):
        self.cls()
        print(self.word)
        print("".join([x[1] for x in self.mem]) + ("|" if self.div and self.run else "" ), flush=True, end='\b\n')

        
    def pressed(self, key: KeyCode):
        try:
            if key == Key.space:
                self.register_char(" ")
            elif key == Key.enter:
                self.run = self.index < self.word_len
            else:
                char = key.char
                self.register_char(char)
            self.display()
        except AttributeError:
            pass
        
    def released(self, key):
        if key == Key.esc or not self.run:
            self.run = False
            return False
        
    def cls(self):
        print("\033[H\033[J", end="")


WORDS = ["test", "peem"]

def generate_dataset(profile):
    return [
        stat for 
            stat_list in [Main().start(word) for word in WORDS] 
        
        for stat in [
            (*x[:-1], x[-1]-stat_list[idx-1 if idx else 0][-1], profile) 
                for idx, x in enumerate(stat_list)
            ]
        ]
    
def start_profile(profile):
    return generate_dataset(profile) , generate_dataset(profile)

def dataset_to_csv(data, name):
    print(data , name)
    pd.DataFrame(
        data = data,
        columns=['prev_char', 'current_char', 'time_used', 'profile']
        ).to_csv(name)
  
if __name__ == "__main__":    
    print("PLEASE START PROFILE 0")
    time.sleep(3)
    train0, test0 = start_profile(0) 
    REFRESH_RATE = 1
    print("PLEASE START PROFILE 1")
    time.sleep(3)
    REFRESH_RATE = 24
    train1, test1 = start_profile(1) 

    dataset_to_csv(train0 + train1, "train.csv")
    dataset_to_csv(test0 + test1, "test.csv")
    
    df = pd.read_csv('train.csv')
    df = df[['time_used', 'profile']].groupby('profile')\
                                    .apply(lambda x: x.time_used.values.tolist())\
                                    .to_frame("list")\
                                    .reset_index()
    X = df["list"].values.tolist()
    y = df["profile"].values.tolist()

    model = KNeighborsClassifier(n_neighbors=1).fit(X, y)
    
    df = pd.read_csv('test.csv')
    for profile in set(df.profile.values.tolist()):
        print(model.predict([df[df.profile == profile].time_used.tolist()]))
    
    for i in range(len(WORDS)+1):
        input()

Editor is loading...