1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
from enum import Enum
from html.parser import HTMLParser
from typing import Any
from urllib.parse import parse_qs, urlparse
import requests.cookies
import requests.sessions
class StateCache:
class TopicState:
def __init__ (self, saved = dict[str, Any]()):
self.last_post = saved.get("last_post", 0)
def get_dict (self) -> dict[str, Any]:
return {
"last_post": self.last_post
}
def parseCookies (doc: dict) -> requests.cookies.RequestsCookieJar:
pass
def __init__ (self, saved = dict[str, Any]):
self.topics = dict[str, dict[str, Any]]()
self.cookies = requests.sessions.cookiejar_from_dict(
saved.get("cookies", dict()))
for k, v in saved.get("topics", dict()).items():
self.topics[k] = StateCache.TopicState(v)
def get_dict (self) -> dict[str, Any]:
ret = dict[str, Any]()
if self.topics:
d = ret["topics"] = dict[str, Any]()
for k, v in self.topics.items():
d[k] = v.get_dict()
ret["cookies"] = self.cookies.get_dict()
return ret
class InnerHTMLExtractor (HTMLParser):
def __init__ (self):
super().__init__()
self.data = list[str]()
def handle_data(self, data: str):
self.data.append(data)
class JWTMarkerExtractor (HTMLParser):
def __init__ (self):
super().__init__()
self.marker = list[str]()
def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]):
if tag.lower() != "a":
return
for kv in attrs:
if kv[0] == "href":
u = urlparse(kv[1])
if u.hostname or u.path:
continue
qs = parse_qs(u.query)
self.marker.extend(qs.get("okkybot-marker", []))
class ProcPostResult (Enum):
UNVIABLE = "Unviable"
YES = "yes"
NO = "no"
MARKER = "marker"
|