summaryrefslogtreecommitdiff
path: root/src/okkybot/__init__.py
blob: e827599ef08bd601b68ead733926619e83575f7d (plain)
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
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"