genocide 181__tar.gz → 183__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. {genocide-181 → genocide-183}/PKG-INFO +1 -7
  2. {genocide-181 → genocide-183}/README.rst +0 -5
  3. {genocide-181 → genocide-183}/docs/_static/genocide.css +2 -2
  4. {genocide-181 → genocide-183}/docs/conf.py +13 -11
  5. {genocide-181 → genocide-183}/docs/evidence.rst +1 -6
  6. {genocide-181 → genocide-183}/docs/guilty.rst +0 -5
  7. {genocide-181 → genocide-183}/docs/index.rst +1 -13
  8. {genocide-181 → genocide-183}/docs/manual.rst +3 -6
  9. {genocide-181 → genocide-183}/docs/reconsider.rst +0 -6
  10. {genocide-181 → genocide-183}/docs/writings.rst +0 -6
  11. genocide-183/genocide/console.py +83 -0
  12. {genocide-181 → genocide-183}/genocide/control.py +5 -23
  13. {genocide-181 → genocide-183}/genocide/daemon.py +2 -2
  14. {genocide-181 → genocide-183}/genocide/modules/face.py +1 -2
  15. {genocide-181 → genocide-183}/genocide/modules/irc.py +13 -15
  16. {genocide-181 → genocide-183}/genocide/object.py +0 -99
  17. {genocide-181 → genocide-183}/genocide/persist.py +16 -11
  18. {genocide-181 → genocide-183}/genocide/runtime.py +93 -8
  19. {genocide-181 → genocide-183}/genocide/service.py +2 -2
  20. {genocide-181 → genocide-183}/genocide.egg-info/PKG-INFO +1 -7
  21. {genocide-181 → genocide-183}/genocide.egg-info/SOURCES.txt +1 -3
  22. {genocide-181 → genocide-183}/genocide.egg-info/entry_points.txt +1 -0
  23. {genocide-181 → genocide-183}/pyproject.toml +3 -15
  24. genocide-181/docs/about.rst +0 -54
  25. genocide-181/genocide.egg-info/requires.txt +0 -2
  26. genocide-181/genocide.egg-info/zip-safe +0 -1
  27. {genocide-181 → genocide-183}/docs/ECHAabilify.png +0 -0
  28. {genocide-181 → genocide-183}/docs/ECHAclozapine.png +0 -0
  29. {genocide-181 → genocide-183}/docs/ECHAhaldol.png +0 -0
  30. {genocide-181 → genocide-183}/docs/ECHAzyprexa.png +0 -0
  31. {genocide-181 → genocide-183}/docs/OTP111.png +0 -0
  32. {genocide-181 → genocide-183}/docs/OTP222.png +0 -0
  33. {genocide-181 → genocide-183}/docs/_templates/base.rst +0 -0
  34. {genocide-181 → genocide-183}/docs/_templates/class.rst +0 -0
  35. {genocide-181 → genocide-183}/docs/_templates/mine.rst +0 -0
  36. {genocide-181 → genocide-183}/docs/_templates/module.rst +0 -0
  37. {genocide-181 → genocide-183}/docs/ack.png +0 -0
  38. {genocide-181 → genocide-183}/docs/ack3.png +0 -0
  39. {genocide-181 → genocide-183}/docs/bevestigd.jpg +0 -0
  40. {genocide-181 → genocide-183}/docs/bylaw.png +0 -0
  41. {genocide-181 → genocide-183}/docs/files/sitemap.xml +0 -0
  42. {genocide-181 → genocide-183}/docs/genocide.jpg +0 -0
  43. {genocide-181 → genocide-183}/docs/genocide.png +0 -0
  44. {genocide-181 → genocide-183}/docs/informed.jpg +0 -0
  45. {genocide-181 → genocide-183}/docs/kamer2.png +0 -0
  46. {genocide-181 → genocide-183}/docs/pdf/EM_Ack_OTP-CR-117_19.pdf +0 -0
  47. {genocide-181 → genocide-183}/docs/pdf/EM_T04_OTP-CR-117_19.pdf +0 -0
  48. {genocide-181 → genocide-183}/docs/pdf/EM_T07_OTP-CR-117_19_001.pdf +0 -0
  49. {genocide-181 → genocide-183}/docs/pdf/Kamer.pdf +0 -0
  50. {genocide-181 → genocide-183}/docs/pdf/Rome-Statute.pdf +0 -0
  51. {genocide-181 → genocide-183}/docs/pdf/bevestigd.pdf +0 -0
  52. {genocide-181 → genocide-183}/docs/request.rst +0 -0
  53. {genocide-181 → genocide-183}/docs/robots.txt +0 -0
  54. {genocide-181 → genocide-183}/docs/skull3.png +0 -0
  55. {genocide-181 → genocide-183}/docs/verbatim7.png +0 -0
  56. {genocide-181 → genocide-183}/genocide/modules/__init__.py +0 -0
  57. {genocide-181 → genocide-183}/genocide/modules/cmd.py +0 -0
  58. {genocide-181 → genocide-183}/genocide/modules/err.py +0 -0
  59. {genocide-181 → genocide-183}/genocide/modules/fnd.py +0 -0
  60. {genocide-181 → genocide-183}/genocide/modules/log.py +0 -0
  61. {genocide-181 → genocide-183}/genocide/modules/mdl.py +0 -0
  62. {genocide-181 → genocide-183}/genocide/modules/mod.py +0 -0
  63. {genocide-181 → genocide-183}/genocide/modules/opm.py +0 -0
  64. {genocide-181 → genocide-183}/genocide/modules/req.py +0 -0
  65. {genocide-181 → genocide-183}/genocide/modules/rss.py +0 -0
  66. {genocide-181 → genocide-183}/genocide/modules/tdo.py +0 -0
  67. {genocide-181 → genocide-183}/genocide/modules/thr.py +0 -0
  68. {genocide-181 → genocide-183}/genocide/modules/upt.py +0 -0
  69. {genocide-181 → genocide-183}/genocide.egg-info/dependency_links.txt +0 -0
  70. {genocide-181 → genocide-183}/genocide.egg-info/top_level.txt +0 -0
  71. {genocide-181 → genocide-183}/setup.cfg +0 -0
  72. {genocide-181 → genocide-183}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: genocide
3
- Version: 181
3
+ Version: 183
4
4
  Summary: Elderly, Handicapped, Criminals, Wicked
5
5
  Author-email: Bart Thate <bthate@dds.nl>
6
6
  License: Public Domain
@@ -13,7 +13,6 @@ Classifier: Operating System :: Unix
13
13
  Classifier: Programming Language :: Python
14
14
  Classifier: Topic :: Utilities
15
15
  Description-Content-Type: text/x-rst
16
- Provides-Extra: dev
17
16
 
18
17
  | **Information and Evidence Unit**
19
18
  | **Office of the Prosecutor**
@@ -68,8 +67,3 @@ are poison at the time they voted for this law and the day the Wfz law took
68
67
  effect (1-1-2019), i ask the prosecutor to prosecute the king for making the
69
68
  commiting of the above mentioned crimes (killing, torture and impotent making)
70
69
  possible.
71
-
72
-
73
- p.s.
74
-
75
- #. ``OTP-CR-117/19`` entered Communications Register on ``4 march 2019``
@@ -51,8 +51,3 @@ are poison at the time they voted for this law and the day the Wfz law took
51
51
  effect (1-1-2019), i ask the prosecutor to prosecute the king for making the
52
52
  commiting of the above mentioned crimes (killing, torture and impotent making)
53
53
  possible.
54
-
55
-
56
- p.s.
57
-
58
- #. ``OTP-CR-117/19`` entered Communications Register on ``4 march 2019``
@@ -15,8 +15,8 @@ body {
15
15
  font-size: 113%;
16
16
  background-color: #fff;
17
17
  color: #555;
18
- margin: 30px;
19
- padding: 0px 30px 0px 30px;
18
+ margin: 40px;
19
+ padding: 0px 30px 10px 30px;
20
20
  }
21
21
 
22
22
 
@@ -5,11 +5,11 @@
5
5
  # ruff: noqa: E402, E501
6
6
 
7
7
 
8
- "Office of the Prosecutor's Communication 117 of the year 2019"
8
+ "Office of the Prosecutor's 117th communication of the year 2019"
9
9
 
10
10
 
11
11
  NAME = "genocide"
12
- VERSION = "180"
12
+ VERSION = "181"
13
13
 
14
14
 
15
15
  import os
@@ -99,33 +99,35 @@ intersphinx_cache_limit = 1
99
99
 
100
100
  rst_prolog = '''.. image:: genocide.png
101
101
  :width: 100%
102
- :height: 2.6cm
103
- :target: about.html
102
+ :height: 2.4cm
103
+ :target: manual.html
104
104
 
105
105
  .. raw:: html
106
106
 
107
107
  <center>
108
+
108
109
  Elderly, Handicapped, Criminals, Wicked
110
+
111
+ .. raw:: html
112
+
109
113
  </center>
110
114
 
111
115
  '''
112
116
 
113
- rst_epilog = '''.. raw:: html
117
+ rst_epilog = """.. raw:: html
114
118
 
115
119
  <br>
116
120
  <center>
117
121
  <b>
122
+
123
+ :ref:`reconsider <reconsider>` - :ref:`evidence <evidence>` - :ref:`guilty <guilty>` - :ref:`writings <writings>`
118
124
 
119
- :ref:`reconsider <home>` - :ref:`evidence <evidence>` - :ref:`guilty <guilty>` - :ref:`writings <writings>`
120
-
121
-
122
- .. raw: html
125
+ .. raw:: html
123
126
 
124
127
  </b>
125
128
  </center>
126
129
 
127
- '''
128
-
130
+ """
129
131
  autosummary_generate = False
130
132
  autodoc_default_flags = ['members', 'undoc-members', 'private-members', "imported-members"]
131
133
  autodoc_member_order = 'groupwise'
@@ -2,16 +2,11 @@
2
2
 
3
3
  .. raw:: html
4
4
 
5
- <br><br>
5
+ <br><br>
6
6
 
7
7
  .. title:: Evidence
8
8
 
9
9
 
10
- .. raw:: html
11
-
12
- <center><b>EVIDENCE</b></center><br>
13
-
14
-
15
10
  .. _haldol:
16
11
 
17
12
 
@@ -8,11 +8,6 @@
8
8
  .. title:: Guilty
9
9
 
10
10
 
11
- .. raw:: html
12
-
13
- <center><b>GUILTY</b></center><br>
14
-
15
-
16
11
  .. _informed:
17
12
 
18
13
 
@@ -1,4 +1,4 @@
1
- .. _home:
1
+ .. _reconsider:
2
2
 
3
3
 
4
4
  .. raw:: html
@@ -9,11 +9,6 @@
9
9
  .. title:: Reconsider
10
10
 
11
11
 
12
- .. raw:: html
13
-
14
- <center><b>RECONSIDER</b></center><br>
15
-
16
- |
17
12
  | **Information and Evidence Unit**
18
13
  | **Office of the Prosecutor**
19
14
  | **Post Office Box 19519**
@@ -70,16 +65,9 @@ prosecute the king for making the commiting of the above mentioned crimes
70
65
  (killing, torture and impotent making) possible.
71
66
 
72
67
 
73
- p.s.
74
-
75
-
76
- 1) ``OTP-CR-117/19`` entered the Communications Register on ``4 march 2019``
77
-
78
-
79
68
  .. toctree::
80
69
  :hidden:
81
70
 
82
- about
83
71
  reconsider
84
72
  writings
85
73
  evidence
@@ -9,15 +9,11 @@
9
9
  .. title:: Manual
10
10
 
11
11
 
12
- .. raw:: html
13
-
14
- <center><b>MANUAL</b></center><br>
15
-
16
12
 
17
13
  **NAME**
18
14
 
19
15
 
20
- ``GENOCIDE`` - Elderly, Handicapped, Criminals, Wicked
16
+ ``GENOCIDE`` - Since 4 march 2019
21
17
 
22
18
 
23
19
  **SYNOPSIS**
@@ -53,7 +49,7 @@
53
49
 
54
50
  Current status is a :ref:`"no basis to proceed"
55
51
  <writings>` judgement of the prosecutor which
56
- requires a :ref:`"basis to prosecute" <home>`
52
+ requires a :ref:`"basis to prosecute" <reconsider>`
57
53
  to have the king actually arrested.
58
54
 
59
55
 
@@ -180,3 +176,4 @@
180
176
  **COPYRIGHT**
181
177
 
182
178
  | ``GENOCIDE`` is Public Domain.
179
+ |
@@ -1,9 +1,3 @@
1
- .. _reconsider:
2
-
3
-
4
- .. title:: Reconsider
5
-
6
-
7
1
  | **Information and Evidence Unit**
8
2
  | **Office of the Prosecutor**
9
3
  | **Post Office Box 19519**
@@ -10,14 +10,8 @@
10
10
  .. title:: Writings
11
11
 
12
12
 
13
- .. raw:: html
14
-
15
- <center><b>WRITINGS</b></center><br>
16
-
17
-
18
13
  **ACK**
19
14
 
20
-
21
15
  .. raw:: html
22
16
 
23
17
  <br>
@@ -0,0 +1,83 @@
1
+ # This file is placed in the Public Domain.
2
+ # pylint: disable=C0115,C0116,C0415,R0903,R0912,R0915,W0105,W0718,E0402
3
+
4
+
5
+ "main"
6
+
7
+
8
+ import sys
9
+ import termios
10
+ import time
11
+
12
+ from .persist import Config
13
+ from .runtime import Client, Event
14
+ from .runtime import errors, forever, later, parse, scan
15
+
16
+
17
+ cfg = Config()
18
+
19
+
20
+ class Console(Client):
21
+
22
+ def announce(self, txt):
23
+ self.raw(txt)
24
+
25
+ def callback(self, evt):
26
+ Client.callback(self, evt)
27
+ evt.wait()
28
+
29
+ def poll(self):
30
+ evt = Event()
31
+ evt.txt = input("> ")
32
+ evt.type = "command"
33
+ return evt
34
+
35
+ def raw(self, txt):
36
+ print(txt)
37
+
38
+
39
+ def banner():
40
+ tme = time.ctime(time.time()).replace(" ", " ")
41
+ print(f"{cfg.name.upper()} since {tme}")
42
+
43
+
44
+ def wrap(func):
45
+ old = None
46
+ try:
47
+ old = termios.tcgetattr(sys.stdin.fileno())
48
+ except termios.error:
49
+ pass
50
+ try:
51
+ func()
52
+ except (KeyboardInterrupt, EOFError):
53
+ print("")
54
+ except Exception as ex:
55
+ later(ex)
56
+ finally:
57
+ if old:
58
+ termios.tcsetattr(sys.stdin.fileno(), termios.TCSADRAIN, old)
59
+
60
+
61
+ def wrapped():
62
+ wrap(main)
63
+ for line in errors():
64
+ print(line)
65
+
66
+
67
+ def main():
68
+ parse(cfg, " ".join(sys.argv[1:]))
69
+ if "v" in cfg.opts:
70
+ banner()
71
+ from .modules import face
72
+ for mod, thr in scan(face, init="i" in cfg.opts, disable=cfg.sets.dis):
73
+ if "v" in cfg.opts and "output" in dir(mod):
74
+ mod.output = print
75
+ if thr and "w" in cfg.opts:
76
+ thr.join()
77
+ csl = Console()
78
+ csl.start()
79
+ forever()
80
+
81
+
82
+ if __name__ == "__main__":
83
+ wrapped()
@@ -8,38 +8,20 @@
8
8
  import sys
9
9
 
10
10
 
11
- from .object import Config, parse
12
- from .persist import NAME
13
- from .runtime import Client, Commands, Event, errors, later, scan, wrap
11
+ from .persist import Config
12
+ from .runtime import Client, Commands, Event
13
+ from .runtime import command, errors, parse, scan, wrap
14
14
 
15
15
 
16
- Cfg = Config()
16
+ Cfg = Config()
17
17
 
18
18
 
19
19
  class CLI(Client):
20
20
 
21
- def __init__(self):
22
- Client.__init__(self)
23
- self.register("command", command)
24
-
25
21
  def raw(self, txt):
26
22
  print(txt)
27
23
 
28
24
 
29
- def command(bot, evt):
30
- parse(evt, evt.txt)
31
- if "ident" in dir(bot):
32
- evt.orig = bot.ident
33
- func = Commands.cmds.get(evt.cmd, None)
34
- if func:
35
- try:
36
- func(evt)
37
- bot.display(evt)
38
- except Exception as ex:
39
- later(ex)
40
- evt.ready()
41
-
42
-
43
25
  def wrapped():
44
26
  wrap(main)
45
27
  for line in errors():
@@ -49,7 +31,7 @@ def wrapped():
49
31
  def srv(event):
50
32
  import getpass
51
33
  name = getpass.getuser()
52
- event.reply(TXT % (NAME.upper(), name, name, name, NAME))
34
+ event.reply(TXT % (Cfg.name.upper(), name, name, name, Cfg.name))
53
35
 
54
36
 
55
37
  def main():
@@ -9,7 +9,7 @@ import os
9
9
  import sys
10
10
 
11
11
 
12
- from .persist import NAME, pidfile, pidname
12
+ from .persist import Config, pidfile, pidname
13
13
  from .runtime import errors, forever, privileges, scan, wrap
14
14
 
15
15
 
@@ -42,7 +42,7 @@ def wrapped():
42
42
  def main():
43
43
  daemon(True)
44
44
  privileges()
45
- pidfile(pidname(NAME))
45
+ pidfile(pidname(Config.name))
46
46
  from .modules import face
47
47
  scan(face, init=True)
48
48
  forever()
@@ -23,8 +23,7 @@ def __dir__():
23
23
  'req',
24
24
  'rss',
25
25
  'tdo',
26
- 'thr',
27
- 'upt'
26
+ 'thr'
28
27
  )
29
28
 
30
29
 
@@ -16,13 +16,13 @@ import time
16
16
  import _thread
17
17
 
18
18
 
19
- from ..object import Object, edit, format, keys, parse
20
- from ..persist import Cache, ident, last, write
21
- from ..runtime import Commands, Event, Reactor, later, launch
19
+ from ..object import Object, edit, format, keys
20
+ from ..persist import Cache, ident, last, write
21
+ from ..persist import Config as Main
22
+ from ..runtime import Commands, Event, Reactor, later, launch, parse
22
23
 
23
24
 
24
25
  IGNORE = ["PING", "PONG", "PRIVMSG"]
25
- NAME = Object.__module__.rsplit(".", maxsplit=2)[-2]
26
26
 
27
27
 
28
28
  output = None
@@ -47,19 +47,18 @@ def init():
47
47
 
48
48
  class Config(Object):
49
49
 
50
- channel = f'#{NAME}'
50
+ channel = f'#{Main.name}'
51
51
  commands = True
52
52
  control = '!'
53
- edited = time.time()
54
- nick = NAME
53
+ nick = Main.name
55
54
  password = ""
56
55
  port = 6667
57
- realname = NAME
56
+ realname = Main.name
58
57
  sasl = False
59
58
  server = 'localhost'
60
59
  servermodes = ''
61
60
  sleep = 60
62
- username = NAME
61
+ username = Main.name
63
62
  users = False
64
63
 
65
64
  def __init__(self):
@@ -101,7 +100,7 @@ class Output:
101
100
 
102
101
  @staticmethod
103
102
  def extend(channel, txtlist):
104
- if channel not in Output.cache:
103
+ if channel not in dir(Output.cache):
105
104
  Output.cache[channel] = []
106
105
  chanlist = getattr(Output.cache, channel)
107
106
  chanlist.extend(txtlist)
@@ -118,7 +117,7 @@ class Output:
118
117
  return txt
119
118
 
120
119
  def oput(self, channel, txt):
121
- if channel and channel not in Output.cache:
120
+ if channel and channel not in dir(Output.cache):
122
121
  setattr(Output.cache, channel, [])
123
122
  self.oqueue.put_nowait((channel, txt))
124
123
 
@@ -145,7 +144,7 @@ class Output:
145
144
 
146
145
  @staticmethod
147
146
  def size(chan):
148
- if chan in Output.cache:
147
+ if chan in dir(Output.cache):
149
148
  return len(getattr(Output.cache, chan, []))
150
149
  return 0
151
150
 
@@ -557,7 +556,7 @@ def cb_001(bot, evt):
557
556
 
558
557
  def cb_notice(bot, evt):
559
558
  if evt.txt.startswith('VERSION'):
560
- txt = f'\001VERSION {NAME.upper()} 140 - {bot.cfg.username}\001'
559
+ txt = f'\001VERSION {Main.name.upper()} 140 - {bot.cfg.username}\001'
561
560
  bot.docommand('NOTICE', evt.channel, txt)
562
561
 
563
562
 
@@ -616,8 +615,7 @@ def mre(event):
616
615
  return
617
616
  for _x in range(3):
618
617
  txt = Output.gettxt(event.channel)
619
- if txt:
620
- event.reply(txt)
618
+ event.reply(txt)
621
619
  size = IRC.size(event.channel)
622
620
  event.reply(f'{size} more in cache')
623
621
 
@@ -10,30 +10,6 @@ import json
10
10
 
11
11
  class Object:
12
12
 
13
- def __contains__(self, key):
14
- return key in dir(self)
15
-
16
- def __getstate__(self):
17
- pass
18
-
19
- def __iter__(self):
20
- return iter(self.__dict__)
21
-
22
- def __len__(self):
23
- return len(self.__dict__)
24
-
25
- def __str__(self):
26
- return str(self.__dict__)
27
-
28
-
29
- class Obj(Object):
30
-
31
- def __getattr__(self, key):
32
- return self.__dict__.get(key, "")
33
-
34
-
35
- class Config(Obj):
36
-
37
13
  pass
38
14
 
39
15
 
@@ -114,62 +90,6 @@ def match(obj, txt):
114
90
  yield key
115
91
 
116
92
 
117
- def parse(obj, txt=None) -> None:
118
- if txt is None:
119
- txt = ""
120
- args = []
121
- obj.args = []
122
- obj.cmd = ""
123
- obj.gets = Obj()
124
- obj.hasmods = False
125
- obj.index = None
126
- obj.mod = ""
127
- obj.opts = ""
128
- obj.result = []
129
- obj.sets = Obj()
130
- obj.txt = txt or ""
131
- obj.otxt = obj.txt
132
- _nr = -1
133
- for spli in obj.otxt.split():
134
- if spli.startswith("-"):
135
- try:
136
- obj.index = int(spli[1:])
137
- except ValueError:
138
- obj.opts += spli[1:]
139
- continue
140
- if "==" in spli:
141
- key, value = spli.split("==", maxsplit=1)
142
- val = getattr(obj.gets, key, None)
143
- if val:
144
- value = val + "," + value
145
- setattr(obj.gets, key, value)
146
- continue
147
- if "=" in spli:
148
- key, value = spli.split("=", maxsplit=1)
149
- if key == "mod":
150
- obj.hasmods = True
151
- if obj.mod:
152
- obj.mod += f",{value}"
153
- else:
154
- obj.mod = value
155
- continue
156
- setattr(obj.sets, key, value)
157
- continue
158
- _nr += 1
159
- if _nr == 0:
160
- obj.cmd = spli
161
- continue
162
- args.append(spli)
163
- if args:
164
- obj.args = args
165
- obj.txt = obj.cmd or ""
166
- obj.rest = " ".join(obj.args)
167
- obj.txt = obj.cmd + " " + obj.rest
168
- else:
169
- obj.txt = obj.cmd or ""
170
- return obj
171
-
172
-
173
93
  def search(obj, selector, matching=None):
174
94
  res = False
175
95
  if not selector:
@@ -269,22 +189,3 @@ def dump(*args, **kw):
269
189
  def dumps(*args, **kw):
270
190
  kw["cls"] = ObjectEncoder
271
191
  return json.dumps(*args, **kw)
272
-
273
-
274
- def __dir__():
275
- return (
276
- 'Config',
277
- 'Object',
278
- 'Obj',
279
- 'construct',
280
- 'dumps',
281
- 'edit',
282
- 'keys',
283
- 'loads',
284
- 'items',
285
- 'match',
286
- 'parse',
287
- 'search',
288
- 'update',
289
- 'values'
290
- )
@@ -17,9 +17,6 @@ import _thread
17
17
  from .object import Object, dump, load, search, update
18
18
 
19
19
 
20
- NAME = Object.__module__.rsplit(".", maxsplit=2)[-2]
21
-
22
-
23
20
  cachelock = _thread.allocate_lock()
24
21
  disklock = _thread.allocate_lock()
25
22
  findlock = _thread.allocate_lock()
@@ -27,10 +24,17 @@ lock = _thread.allocate_lock()
27
24
  p = os.path.join
28
25
 
29
26
 
30
- class Workdir:
27
+ class Obj(Object):
28
+
29
+ def __getattr__(self, key):
30
+ return self.__dict__.get(key, "")
31
+
32
+
33
+ class Config(Obj):
31
34
 
32
35
  fqns = []
33
- wdr = os.path.expanduser(f"~/.{NAME}")
36
+ name = "obz"
37
+ wdr = os.path.expanduser("~/.{Config.name}")
34
38
 
35
39
 
36
40
  def long(name):
@@ -44,18 +48,18 @@ def long(name):
44
48
 
45
49
 
46
50
  def modname():
47
- return p(Workdir.wdr, "mods")
51
+ return p(Config.wdr, "mods")
48
52
 
49
53
 
50
54
  def pidname(name):
51
- return p(Workdir.wdr, f"{name}.pid")
55
+ return p(Config.wdr, f"{name}.pid")
52
56
 
53
57
 
54
58
  def store(pth=""):
55
- stor = p(Workdir.wdr, "store", "")
59
+ stor = p(Config.wdr, "store", "")
56
60
  if not os.path.exists(stor):
57
61
  skel()
58
- return p(Workdir.wdr, "store", pth)
62
+ return p(Config.wdr, "store", pth)
59
63
 
60
64
 
61
65
  class Cache:
@@ -186,7 +190,7 @@ def pidfile(filename):
186
190
 
187
191
 
188
192
  def skel():
189
- stor = p(Workdir.wdr, "store", "")
193
+ stor = p(Config.wdr, "store", "")
190
194
  path = pathlib.Path(stor)
191
195
  path.mkdir(parents=True, exist_ok=True)
192
196
  return path
@@ -278,7 +282,8 @@ def sync(obj, pth):
278
282
 
279
283
  def __dir__():
280
284
  return (
281
- 'Workdir',
285
+ 'Config',
286
+ 'Obj',
282
287
  'find',
283
288
  'fetch',
284
289
  'last',
@@ -15,6 +15,21 @@ import types
15
15
  import _thread
16
16
 
17
17
 
18
+ class Default:
19
+
20
+ def __contains__(self, key):
21
+ return key in dir(self)
22
+
23
+ def __getattr__(self, key):
24
+ return self.__dict__.get(key, "")
25
+
26
+ def __iter__(self):
27
+ return iter(self.__dict__)
28
+
29
+ def __len__(self):
30
+ return len(self.__dict__)
31
+
32
+
18
33
  class Errors:
19
34
 
20
35
  errors = []
@@ -57,6 +72,20 @@ class Commands:
57
72
  Commands.add(cmdz)
58
73
 
59
74
 
75
+ def command(bot, evt):
76
+ parse(evt, evt.txt)
77
+ if "ident" in dir(bot):
78
+ evt.orig = bot.ident
79
+ func = Commands.cmds.get(evt.cmd, None)
80
+ if func:
81
+ try:
82
+ func(evt)
83
+ bot.display(evt)
84
+ except Exception as ex:
85
+ later(ex)
86
+ evt.ready()
87
+
88
+
60
89
  def modloop(*pkgs, disable=""):
61
90
  for pkg in pkgs:
62
91
  for modname in dir(pkg):
@@ -67,8 +96,6 @@ def modloop(*pkgs, disable=""):
67
96
  yield getattr(pkg, modname)
68
97
 
69
98
 
70
-
71
-
72
99
  def scan(*pkgs, init=False, disable=""):
73
100
  result = []
74
101
  for mod in modloop(*pkgs, disable=disable):
@@ -160,6 +187,10 @@ class Reactor:
160
187
 
161
188
  class Client(Reactor):
162
189
 
190
+ def __init__(self):
191
+ Reactor.__init__(self)
192
+ self.register("command", command)
193
+
163
194
  def display(self, evt):
164
195
  for txt in evt.result:
165
196
  self.raw(txt)
@@ -193,18 +224,16 @@ class BufferedClient(Client, Output):
193
224
  Output.stop(self)
194
225
 
195
226
 
196
- class Event:
227
+ class Event(Default):
197
228
 
198
229
  def __init__(self):
230
+ Default.__init__(self)
199
231
  self._ready = threading.Event()
200
232
  self._thr = None
201
233
  self.result = []
202
234
  self.type = "event"
203
235
  self.txt = ""
204
236
 
205
- def __getattr__(self, key):
206
- return self.__dict__.get(key, "")
207
-
208
237
  def __str__(self):
209
238
  return str(self.__dict__)
210
239
 
@@ -216,8 +245,64 @@ class Event:
216
245
 
217
246
  def wait(self):
218
247
  self._ready.wait()
219
- #if self._thr:
220
- # self._thr.join()
248
+ if self._thr:
249
+ self._thr.join()
250
+
251
+
252
+ def parse(obj, txt=None) -> None:
253
+ if txt is None:
254
+ txt = ""
255
+ args = []
256
+ obj.args = []
257
+ obj.cmd = ""
258
+ obj.gets = Default()
259
+ obj.hasmods = False
260
+ obj.index = None
261
+ obj.mod = ""
262
+ obj.opts = ""
263
+ obj.result = []
264
+ obj.sets = Default()
265
+ obj.txt = txt or ""
266
+ obj.otxt = obj.txt
267
+ _nr = -1
268
+ for spli in obj.otxt.split():
269
+ if spli.startswith("-"):
270
+ try:
271
+ obj.index = int(spli[1:])
272
+ except ValueError:
273
+ obj.opts += spli[1:]
274
+ continue
275
+ if "==" in spli:
276
+ key, value = spli.split("==", maxsplit=1)
277
+ val = getattr(obj.gets, key, None)
278
+ if val:
279
+ value = val + "," + value
280
+ setattr(obj.gets, key, value)
281
+ continue
282
+ if "=" in spli:
283
+ key, value = spli.split("=", maxsplit=1)
284
+ if key == "mod":
285
+ obj.hasmods = True
286
+ if obj.mod:
287
+ obj.mod += f",{value}"
288
+ else:
289
+ obj.mod = value
290
+ continue
291
+ setattr(obj.sets, key, value)
292
+ continue
293
+ _nr += 1
294
+ if _nr == 0:
295
+ obj.cmd = spli
296
+ continue
297
+ args.append(spli)
298
+ if args:
299
+ obj.args = args
300
+ obj.txt = obj.cmd or ""
301
+ obj.rest = " ".join(obj.args)
302
+ obj.txt = obj.cmd + " " + obj.rest
303
+ else:
304
+ obj.txt = obj.cmd or ""
305
+ return obj
221
306
 
222
307
 
223
308
  class Thread(threading.Thread):
@@ -5,13 +5,13 @@
5
5
  "service"
6
6
 
7
7
 
8
- from .persist import NAME, pidfile, pidname
8
+ from .persist import Config, pidfile, pidname
9
9
  from .runtime import errors, forever, privileges, scan, wrap
10
10
 
11
11
 
12
12
  def service():
13
13
  privileges()
14
- pidfile(pidname(NAME))
14
+ pidfile(pidname(Config.name))
15
15
  from .modules import face as mods
16
16
  scan(mods, init=True)
17
17
  forever()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: genocide
3
- Version: 181
3
+ Version: 183
4
4
  Summary: Elderly, Handicapped, Criminals, Wicked
5
5
  Author-email: Bart Thate <bthate@dds.nl>
6
6
  License: Public Domain
@@ -13,7 +13,6 @@ Classifier: Operating System :: Unix
13
13
  Classifier: Programming Language :: Python
14
14
  Classifier: Topic :: Utilities
15
15
  Description-Content-Type: text/x-rst
16
- Provides-Extra: dev
17
16
 
18
17
  | **Information and Evidence Unit**
19
18
  | **Office of the Prosecutor**
@@ -68,8 +67,3 @@ are poison at the time they voted for this law and the day the Wfz law took
68
67
  effect (1-1-2019), i ask the prosecutor to prosecute the king for making the
69
68
  commiting of the above mentioned crimes (killing, torture and impotent making)
70
69
  possible.
71
-
72
-
73
- p.s.
74
-
75
- #. ``OTP-CR-117/19`` entered Communications Register on ``4 march 2019``
@@ -7,7 +7,6 @@ docs/ECHAhaldol.png
7
7
  docs/ECHAzyprexa.png
8
8
  docs/OTP111.png
9
9
  docs/OTP222.png
10
- docs/about.rst
11
10
  docs/ack.png
12
11
  docs/ack3.png
13
12
  docs/bevestigd.jpg
@@ -39,6 +38,7 @@ docs/pdf/EM_T07_OTP-CR-117_19_001.pdf
39
38
  docs/pdf/Kamer.pdf
40
39
  docs/pdf/Rome-Statute.pdf
41
40
  docs/pdf/bevestigd.pdf
41
+ genocide/console.py
42
42
  genocide/control.py
43
43
  genocide/daemon.py
44
44
  genocide/object.py
@@ -49,9 +49,7 @@ genocide.egg-info/PKG-INFO
49
49
  genocide.egg-info/SOURCES.txt
50
50
  genocide.egg-info/dependency_links.txt
51
51
  genocide.egg-info/entry_points.txt
52
- genocide.egg-info/requires.txt
53
52
  genocide.egg-info/top_level.txt
54
- genocide.egg-info/zip-safe
55
53
  genocide/modules/__init__.py
56
54
  genocide/modules/cmd.py
57
55
  genocide/modules/err.py
@@ -1,4 +1,5 @@
1
1
  [console_scripts]
2
2
  genocide = genocide.control:wrapped
3
+ genocidec = genocide.console:wrapped
3
4
  genocided = genocide.daemon:main
4
5
  genocides = genocide.service:wrapped
@@ -2,10 +2,11 @@
2
2
  requires = ["setuptools>=43.0.0", "wheel"]
3
3
  build-backend = "setuptools.build_meta"
4
4
 
5
+
5
6
  [project]
6
7
  name = "genocide"
7
8
  description = "Elderly, Handicapped, Criminals, Wicked"
8
- version = "181"
9
+ version = "183"
9
10
  authors = [
10
11
  {name = "Bart Thate", email = "bthate@dds.nl" },
11
12
  ]
@@ -19,17 +20,14 @@ classifiers=[
19
20
  'Topic :: Utilities'
20
21
  ]
21
22
 
22
- [project.optional-dependencies]
23
- dev = []
24
-
25
23
 
26
24
  [project.scripts]
27
25
  "genocide" = "genocide.control:wrapped"
26
+ "genocidec" = "genocide.console:wrapped"
28
27
  "genocided" = "genocide.daemon:main"
29
28
  "genocides" = "genocide.service:wrapped"
30
29
 
31
30
 
32
-
33
31
  [project.urls]
34
32
  "home" = "https://pypi.org/project/genocide"
35
33
  "bugs" = "https://github.com/bthate/genocide/issues"
@@ -41,13 +39,11 @@ packages = [
41
39
  "genocide",
42
40
  "genocide.modules",
43
41
  ]
44
- zip-safe = true
45
42
 
46
43
 
47
44
  [tool.setuptools.data-files]
48
45
  "share/doc/genocide/docs" = [
49
46
  "docs/ack.png",
50
- "docs/about.rst",
51
47
  "docs/ack3.png",
52
48
  "docs/bevestigd.jpg",
53
49
  "docs/bylaw.png",
@@ -101,11 +97,3 @@ zip-safe = true
101
97
  "docs/_templates/mine.rst",
102
98
  "docs/_templates/module.rst"
103
99
  ]
104
-
105
-
106
- [tool.setuptools.exclude-package-data]
107
- "*" = [
108
- "env*",
109
- "html*",
110
- "test*"
111
- ]
@@ -1,54 +0,0 @@
1
- .. _about:
2
-
3
-
4
- .. raw:: html
5
-
6
- <br><br>
7
-
8
- .. title:: About
9
-
10
-
11
- .. raw:: html
12
-
13
- <center><b>ABOUT</b></center><br>
14
-
15
- In 2018 i informed the king of the netherlands that what he calls
16
- medicine in his "care" laws are not medicine but poison. Proof of
17
- these medicine being poison were shown to the king, who's (personal)
18
- kabinet wrote back that "the king took note of what i have written".
19
-
20
- Using poison makes the care laws used in the netherlands to provide
21
- care to elderly and handicapped, criminals and psychiatric patients
22
- not care laws but genocide laws with which the king is killing groups
23
- of the population by giving them poison instead of medicine in
24
- the "care" they are forced to undergo.
25
-
26
- I wrote the prosecutor asking for an arrest of the king (make him
27
- stop), the prosecutor decided to call it a "no basis to proceed".
28
-
29
- .. raw:: html
30
-
31
- <br>
32
- <center>
33
- <b>
34
-
35
- It requires a :ref:`basis to prosecute <reconsider>` of the prosecutor
36
- to get the king in his cell and his genocide, thereby, stopped.
37
-
38
- .. raw:: html
39
-
40
- </center>
41
- </b>
42
- <br>
43
-
44
- .. raw:: html
45
-
46
- <center>
47
-
48
- .. image:: skull3.png
49
- :width: 90%
50
- :target: manual.html
51
-
52
- .. raw:: html
53
-
54
- </center>
@@ -1,2 +0,0 @@
1
-
2
- [dev]
@@ -1 +0,0 @@
1
-
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes