116 lines
2.4 KiB
Python
Executable File
116 lines
2.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
#
|
|
# Usage:
|
|
#
|
|
# Python: subprocess.run(["python", "/home/honney/.bin/tracker.py", "add", "name"])
|
|
# Bash: /home/honney/.bin/tracker.py add my_script
|
|
#
|
|
|
|
import sys
|
|
import csv
|
|
import os
|
|
|
|
DB_FILE = "/home/honney/.bin/data/tracker.csv"
|
|
|
|
|
|
def load_data():
|
|
data = {}
|
|
if not os.path.exists(DB_FILE):
|
|
return data
|
|
|
|
with open(DB_FILE, newline="") as f:
|
|
reader = csv.reader(f)
|
|
for row in reader:
|
|
if len(row) != 2:
|
|
continue
|
|
name, count = row
|
|
data[name] = int(count)
|
|
return data
|
|
|
|
|
|
def save_data(data):
|
|
with open(DB_FILE, "w", newline="") as f:
|
|
writer = csv.writer(f)
|
|
for name, count in data.items():
|
|
writer.writerow([name, count])
|
|
|
|
|
|
def add_entry(name):
|
|
data = load_data()
|
|
data[name] = data.get(name, 0) + 1
|
|
save_data(data)
|
|
# print(f"{name}: {data[name]}")
|
|
|
|
def sub_entry(name, amount=1):
|
|
data = load_data()
|
|
|
|
if name not in data:
|
|
print(f"{name} not found.")
|
|
return
|
|
|
|
data[name] -= amount
|
|
|
|
if data[name] <= 0:
|
|
del data[name] # remove entry completely
|
|
# alternatively: data[name] = 0
|
|
save_data(data)
|
|
|
|
def show_ranking():
|
|
data = load_data()
|
|
if not data:
|
|
print("No data yet.")
|
|
return
|
|
|
|
sorted_data = sorted(data.items(), key=lambda x: x[1], reverse=True)
|
|
|
|
print("Ranking:")
|
|
for i, (name, count) in enumerate(sorted_data, start=1):
|
|
print(f"{i}. {name} - {count}")
|
|
|
|
|
|
def main():
|
|
if len(sys.argv) < 2:
|
|
print("Usage:")
|
|
print(" tracker.py add <name>")
|
|
print(" tracker.py sub <name> (<amount>)")
|
|
print(" tracker.py ranking")
|
|
sys.exit(1)
|
|
|
|
mode = sys.argv[1]
|
|
|
|
if mode == "add":
|
|
if len(sys.argv) < 3:
|
|
print("Error: Missing name")
|
|
sys.exit(1)
|
|
name = sys.argv[2]
|
|
add_entry(name)
|
|
|
|
elif mode == "sub":
|
|
if len(sys.argv) < 3:
|
|
print("Error: Missing name")
|
|
sys.exit(1)
|
|
|
|
name = sys.argv[2]
|
|
amount = 1
|
|
|
|
if len(sys.argv) >= 4:
|
|
try:
|
|
amount = int(sys.argv[3])
|
|
except ValueError:
|
|
print("Error: amount must be a number")
|
|
sys.exit(1)
|
|
|
|
sub_entry(name, amount)
|
|
|
|
elif mode == "ranking":
|
|
show_ranking()
|
|
|
|
else:
|
|
print(f"Unknown mode: {mode}")
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|