Muttered3 commited on
Commit
61b042a
·
verified ·
1 Parent(s): a34ee82

Rename db.py to state.py

Browse files
Files changed (2) hide show
  1. db.py +0 -92
  2. state.py +51 -0
db.py DELETED
@@ -1,92 +0,0 @@
1
- import redis.asyncio as redis
2
- import os
3
-
4
- _redis_pool = None
5
-
6
- async def get_redis():
7
- global _redis_pool
8
- if _redis_pool is None:
9
- redis_url = os.environ.get("REDIS_URL", "redis://localhost:6379")
10
- _redis_pool = redis.ConnectionPool.from_url(
11
- redis_url,
12
- decode_responses=True,
13
- health_check_interval=30,
14
- max_connections=500
15
- )
16
- return redis.Redis(connection_pool=_redis_pool)
17
-
18
- async def get_state():
19
- r = await get_redis()
20
- state = await r.hgetall("frag:state")
21
- if not state:
22
- state = {"running": "0", "paused": "0", "total": "0", "processed": "0", "min_length": "4"}
23
- if "min_length" not in state:
24
- state["min_length"] = "4"
25
- return state
26
-
27
- async def set_state(**kwargs):
28
- r = await get_redis()
29
- await r.hset("frag:state", mapping=kwargs)
30
-
31
- async def get_counts():
32
- r = await get_redis()
33
- return await r.hgetall("frag:counts")
34
-
35
- async def queue_size():
36
- r = await get_redis()
37
- return await r.llen("frag:queue")
38
-
39
- async def get_concurrency():
40
- r = await get_redis()
41
- c = await r.get("frag:concurrency")
42
- return int(c) if c else 10
43
-
44
- async def set_concurrency(val):
45
- r = await get_redis()
46
- await r.set("frag:concurrency", val)
47
-
48
- async def mark_done(word, status):
49
- r = await get_redis()
50
- pipe = r.pipeline()
51
- pipe.sadd("frag:done", word)
52
- pipe.hincrby("frag:counts", status.lower(), 1)
53
-
54
- status_map = {
55
- "TAKEN": "frag:taken",
56
- "UNAVAILABLE": "frag:unavailable",
57
- "SOLD": "frag:sold",
58
- "ON_AUCTION": "frag:auction",
59
- "AVAILABLE": "frag:available",
60
- "FOR_SALE": "frag:forsale"
61
- }
62
-
63
- if status in status_map:
64
- pipe.sadd(status_map[status], word)
65
-
66
- pipe.hincrby("frag:state", "processed", 1)
67
- await pipe.execute()
68
-
69
- async def save_working_proxies(proxies):
70
- r = await get_redis()
71
- if proxies:
72
- await r.delete("frag:proxies")
73
- await r.sadd("frag:proxies", *proxies)
74
-
75
- async def get_proxy_count():
76
- r = await get_redis()
77
- return await r.scard("frag:proxies")
78
-
79
- async def get_random_proxy():
80
- r = await get_redis()
81
- return await r.srandmember("frag:proxies")
82
-
83
- async def get_all_taken(): r = await get_redis(); return await r.smembers("frag:taken")
84
- async def get_all_unavailable(): r = await get_redis(); return await r.smembers("frag:unavailable")
85
- async def get_all_sold(): r = await get_redis(); return await r.smembers("frag:sold")
86
- async def get_all_forsale(): r = await get_redis(); return await r.smembers("frag:forsale")
87
- async def get_all_auction(): r = await get_redis(); return await r.smembers("frag:auction")
88
- async def get_all_available(): r = await get_redis(); return await r.smembers("frag:available")
89
-
90
- async def flush_all():
91
- r = await get_redis()
92
- await r.flushdb()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
state.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import asyncio
2
+ import aiofiles
3
+ import os
4
+ from logger import get_logger
5
+
6
+ log = get_logger()
7
+
8
+ class AppState:
9
+ def __init__(self):
10
+ self.status = "STOPPED" # STOPPED, RUNNING, PAUSED
11
+ self.concurrency = 10
12
+ self.min_length = 4
13
+
14
+ self.total_words = 0
15
+ self.processed = 0
16
+ self.counts = {"taken": 0, "unavailable": 0, "sold": 0, "auction": 0, "available": 0, "forsale": 0}
17
+
18
+ self.queue = None # Will be initialized in the event loop
19
+ self.proxies = []
20
+
21
+ # Ensure output directory exists
22
+ if not os.path.exists("results"):
23
+ os.makedirs("results")
24
+
25
+ async def init_queue(self):
26
+ if self.queue is None:
27
+ self.queue = asyncio.Queue()
28
+
29
+ async def add_to_queue(self, words):
30
+ await self.init_queue()
31
+ for w in words:
32
+ await self.queue.put(w)
33
+ self.total_words = self.queue.qsize() + self.processed
34
+
35
+ async def save_result(self, word, status):
36
+ self.processed += 1
37
+ clean_status = status.lower().replace("_", "")
38
+
39
+ if clean_status in self.counts:
40
+ self.counts[clean_status] += 1
41
+
42
+ # Append immediately to disk so we never lose data on crash
43
+ filename = f"results/{clean_status}.txt"
44
+ try:
45
+ async with aiofiles.open(filename, "a", encoding="utf-8") as f:
46
+ await f.write(f"{word}\n")
47
+ except Exception as e:
48
+ log.error(f"Failed to write {word} to {filename}: {e}")
49
+
50
+ # Global singleton instance
51
+ state = AppState()