not1mm 24.11.17__tar.gz → 24.11.18__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 (176) hide show
  1. {not1mm-24.11.17 → not1mm-24.11.18}/PKG-INFO +4 -1
  2. {not1mm-24.11.17 → not1mm-24.11.18}/README.md +3 -0
  3. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/new_contest.ui +5 -0
  4. not1mm-24.11.18/not1mm/lib/version.py +3 -0
  5. not1mm-24.11.18/not1mm/plugins/darc_xmas.py +576 -0
  6. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm.egg-info/PKG-INFO +4 -1
  7. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm.egg-info/SOURCES.txt +1 -0
  8. {not1mm-24.11.17 → not1mm-24.11.18}/pyproject.toml +1 -1
  9. not1mm-24.11.17/not1mm/lib/version.py +0 -3
  10. {not1mm-24.11.17 → not1mm-24.11.18}/LICENSE +0 -0
  11. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/__init__.py +0 -0
  12. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/__main__.py +0 -0
  13. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/bandmap.py +0 -0
  14. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/checkwindow.py +0 -0
  15. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/JetBrainsMono-ExtraLight.ttf +0 -0
  16. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/MASTER.SCP +0 -0
  17. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/about.ui +0 -0
  18. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/alpha bravo charlie delta.txt +0 -0
  19. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/bandmap.ui +0 -0
  20. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/check.png +0 -0
  21. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/checkwindow.ui +0 -0
  22. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/configuration.ui +0 -0
  23. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/contests.sql +0 -0
  24. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/cty.json +0 -0
  25. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/cwmacros.txt +0 -0
  26. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/donors.html +0 -0
  27. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/editcontact.ui +0 -0
  28. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/editmacro.ui +0 -0
  29. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/greendot.png +0 -0
  30. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/k6gte-not1mm.desktop +0 -0
  31. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/k6gte.not1mm-128.png +0 -0
  32. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/k6gte.not1mm-32.png +0 -0
  33. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/k6gte.not1mm-64.png +0 -0
  34. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/logwindow.ui +0 -0
  35. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/logwindowx.ui +0 -0
  36. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/main.ui +0 -0
  37. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/not1mm.html +0 -0
  38. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/opon.ui +0 -0
  39. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/0.wav +0 -0
  40. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/1.wav +0 -0
  41. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/2.wav +0 -0
  42. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/3.wav +0 -0
  43. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/4.wav +0 -0
  44. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/5.wav +0 -0
  45. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/6.wav +0 -0
  46. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/7.wav +0 -0
  47. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/73.wav +0 -0
  48. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/8.wav +0 -0
  49. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/9.wav +0 -0
  50. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/a.wav +0 -0
  51. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/again.wav +0 -0
  52. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/b.wav +0 -0
  53. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/c.wav +0 -0
  54. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/contest.wav +0 -0
  55. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/cq.wav +0 -0
  56. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/cq2.wav +0 -0
  57. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/d.wav +0 -0
  58. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/e.wav +0 -0
  59. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/f.wav +0 -0
  60. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/g.wav +0 -0
  61. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/h.wav +0 -0
  62. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/i.wav +0 -0
  63. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/j.wav +0 -0
  64. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/k.wav +0 -0
  65. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/k6gte.wav +0 -0
  66. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/l.wav +0 -0
  67. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/m.wav +0 -0
  68. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/mynumber.wav +0 -0
  69. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/n.wav +0 -0
  70. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/nil.wav +0 -0
  71. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/o.wav +0 -0
  72. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/p.wav +0 -0
  73. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/q.wav +0 -0
  74. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/r.wav +0 -0
  75. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/roger.wav +0 -0
  76. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/s.wav +0 -0
  77. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/space.wav +0 -0
  78. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/t.wav +0 -0
  79. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/thankyou.wav +0 -0
  80. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/thankyouqrz.wav +0 -0
  81. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/u.wav +0 -0
  82. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/v.wav +0 -0
  83. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/w.wav +0 -0
  84. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/x.wav +0 -0
  85. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/y.wav +0 -0
  86. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/yourcall.wav +0 -0
  87. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/phonetics/z.wav +0 -0
  88. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/pickcontest.ui +0 -0
  89. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/radio_green.png +0 -0
  90. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/radio_grey.png +0 -0
  91. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/radio_red.png +0 -0
  92. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/reddot.png +0 -0
  93. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/rttymacros.txt +0 -0
  94. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/settings.ui +0 -0
  95. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/splash.png +0 -0
  96. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/ssbmacros.txt +0 -0
  97. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/data/vfo.ui +0 -0
  98. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/fsutils.py +0 -0
  99. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/__init__.py +0 -0
  100. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/about.py +0 -0
  101. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/cat_interface.py +0 -0
  102. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/cwinterface.py +0 -0
  103. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/database.py +0 -0
  104. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/edit_contact.py +0 -0
  105. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/edit_macro.py +0 -0
  106. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/edit_opon.py +0 -0
  107. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/edit_station.py +0 -0
  108. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/fldigi_sendstring.py +0 -0
  109. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/fldigi_watcher.py +0 -0
  110. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/ft8_watcher.py +0 -0
  111. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/ham_utility.py +0 -0
  112. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/lookup.py +0 -0
  113. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/multicast.py +0 -0
  114. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/n1mm.py +0 -0
  115. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/new_contest.py +0 -0
  116. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/plugin_common.py +0 -0
  117. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/select_contest.py +0 -0
  118. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/settings.py +0 -0
  119. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/super_check_partial.py +0 -0
  120. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lib/versiontest.py +0 -0
  121. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/logwindow.py +0 -0
  122. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/lookupservice.py +0 -0
  123. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/10_10_fall_cw.py +0 -0
  124. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/10_10_spring_cw.py +0 -0
  125. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/10_10_summer_phone.py +0 -0
  126. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/10_10_winter_phone.py +0 -0
  127. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/__init__.py +0 -0
  128. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/arrl_10m.py +0 -0
  129. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/arrl_dx_cw.py +0 -0
  130. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/arrl_dx_ssb.py +0 -0
  131. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/arrl_field_day.py +0 -0
  132. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/arrl_rtty_ru.py +0 -0
  133. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/arrl_ss_cw.py +0 -0
  134. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/arrl_ss_phone.py +0 -0
  135. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/arrl_vhf_jan.py +0 -0
  136. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/arrl_vhf_jun.py +0 -0
  137. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/arrl_vhf_sep.py +0 -0
  138. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/canada_day.py +0 -0
  139. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/cq_160_cw.py +0 -0
  140. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/cq_160_ssb.py +0 -0
  141. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/cq_wpx_cw.py +0 -0
  142. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/cq_wpx_rtty.py +0 -0
  143. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/cq_wpx_ssb.py +0 -0
  144. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/cq_ww_cw.py +0 -0
  145. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/cq_ww_rtty.py +0 -0
  146. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/cq_ww_ssb.py +0 -0
  147. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/cwt.py +0 -0
  148. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/general_logging.py +0 -0
  149. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/helvetia.py +0 -0
  150. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/iaru_fieldday_r1_cw.py +0 -0
  151. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/iaru_fieldday_r1_ssb.py +0 -0
  152. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/iaru_hf.py +0 -0
  153. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/icwc_mst.py +0 -0
  154. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/jidx_cw.py +0 -0
  155. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/jidx_ph.py +0 -0
  156. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/k1usn_sst.py +0 -0
  157. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/lz-dx.py +0 -0
  158. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/naqp_cw.py +0 -0
  159. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/naqp_rtty.py +0 -0
  160. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/naqp_ssb.py +0 -0
  161. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/phone_weekly_test.py +0 -0
  162. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/raem.py +0 -0
  163. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/ref_cw.py +0 -0
  164. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/ref_ssb.py +0 -0
  165. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/stew_perry_topband.py +0 -0
  166. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/weekly_rtty.py +0 -0
  167. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/plugins/winter_field_day.py +0 -0
  168. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/radio.py +0 -0
  169. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/test.py +0 -0
  170. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/vfo.py +0 -0
  171. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm/voice_keying.py +0 -0
  172. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm.egg-info/dependency_links.txt +0 -0
  173. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm.egg-info/entry_points.txt +0 -0
  174. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm.egg-info/requires.txt +0 -0
  175. {not1mm-24.11.17 → not1mm-24.11.18}/not1mm.egg-info/top_level.txt +0 -0
  176. {not1mm-24.11.17 → not1mm-24.11.18}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 24.11.17
3
+ Version: 24.11.18
4
4
  Summary: NOT1MM Logger
5
5
  Author-email: Michael Bridak <michael.bridak@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/mbridak/not1mm
@@ -219,12 +219,14 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
219
219
  - **CQ WPX CW, RTTY, SSB**
220
220
  - **CQ World Wide CW, RTTY, SSB**
221
221
  - **CWOps CWT**
222
+ - **DARC Xmas**
222
223
  - **Helvetia**
223
224
  - IARU Fieldday R1 CW, SSB
224
225
  - IARU HF
225
226
  - ICWC MST
226
227
  - Japan International DX CW, SSB
227
228
  - **K1USN Slow Speed Test**
229
+ - **LZ DX**
228
230
  - **NAQP CW, RTTY, SSB**
229
231
  - Phone Weekly Test
230
232
  - **RAEM**
@@ -236,6 +238,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
236
238
 
237
239
  ## Recent Changes (Polishing the Turd)
238
240
 
241
+ - [24-11-18] Accepted PR from dg9vh for the DARC XMAS Contest.
239
242
  - [24-11-17] Accepted PR from dg9vh for the LZ DX contest.
240
243
  - [24-11-15] Made checkwindow font bigger and match a little more contrasted.
241
244
  - [24-11-12] add check for ipv4 address for CAT.
@@ -188,12 +188,14 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
188
188
  - **CQ WPX CW, RTTY, SSB**
189
189
  - **CQ World Wide CW, RTTY, SSB**
190
190
  - **CWOps CWT**
191
+ - **DARC Xmas**
191
192
  - **Helvetia**
192
193
  - IARU Fieldday R1 CW, SSB
193
194
  - IARU HF
194
195
  - ICWC MST
195
196
  - Japan International DX CW, SSB
196
197
  - **K1USN Slow Speed Test**
198
+ - **LZ DX**
197
199
  - **NAQP CW, RTTY, SSB**
198
200
  - Phone Weekly Test
199
201
  - **RAEM**
@@ -205,6 +207,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
205
207
 
206
208
  ## Recent Changes (Polishing the Turd)
207
209
 
210
+ - [24-11-18] Accepted PR from dg9vh for the DARC XMAS Contest.
208
211
  - [24-11-17] Accepted PR from dg9vh for the LZ DX contest.
209
212
  - [24-11-15] Made checkwindow font bigger and match a little more contrasted.
210
213
  - [24-11-12] add check for ipv4 address for CAT.
@@ -307,6 +307,11 @@
307
307
  <string>CWT</string>
308
308
  </property>
309
309
  </item>
310
+ <item>
311
+ <property name="text">
312
+ <string>DARC XMAS</string>
313
+ </property>
314
+ </item>
310
315
  <item>
311
316
  <property name="text">
312
317
  <string>HELVETIA</string>
@@ -0,0 +1,3 @@
1
+ """It's the version"""
2
+
3
+ __version__ = "24.11.18"
@@ -0,0 +1,576 @@
1
+ """DARC XMAS plugin"""
2
+
3
+ # pylint: disable=invalid-name, unused-argument, unused-variable, c-extension-no-member, unused-import
4
+
5
+ # DARC Christmas Contest
6
+ # Status: Active
7
+ # Geographic Focus: Germany
8
+ # Participation: Worldwide
9
+ # Awards: Worldwide
10
+ # Mode: CW, SSB
11
+ # Bands: 80, 40m
12
+ # Classes: Single Op (Low/High)
13
+ # Max power: HP: >100 watts
14
+ # LP: 100 watts
15
+ # Exchange: RST + DOK
16
+ # non-Member (DL): RST + 'NM' or 'no member'
17
+ # outside DL: RST + serial number
18
+ # Work stations: Once per band and mode
19
+ # QSO Points: 1 point per QSO
20
+ # Multipliers: DOK (DARC/VFDB), 'NM' does not count + each WPX-prefix per band
21
+ # Score Calculation: Total score = total QSO points x total mults
22
+ # Mail logs to: (none)
23
+ # Find rules at: https://www.darc.de/der-club/referate/conteste/weihnachtswettbewerb/regeln/
24
+ # Upload logs at: https://dxhf2.darc.de/~xmaslog/upload.cgi?form=referat&lang=de
25
+ # Cabrillo name: XMAS
26
+
27
+
28
+ import datetime
29
+ import logging
30
+
31
+ from pathlib import Path
32
+
33
+ from PyQt6 import QtWidgets
34
+
35
+ from not1mm.lib.plugin_common import gen_adif, get_points
36
+ from not1mm.lib.version import __version__
37
+
38
+ logger = logging.getLogger(__name__)
39
+
40
+ EXCHANGE_HINT = "DOK/NM or #"
41
+
42
+ name = "DARC XMAS"
43
+ mode = "BOTH" # CW SSB BOTH RTTY
44
+ # columns = [0, 1, 2, 3, 4, 5, 6, 11, 15]
45
+ columns = [
46
+ "YYYY-MM-DD HH:MM:SS",
47
+ "Call",
48
+ "Freq",
49
+ "Snt",
50
+ "Rcv",
51
+ "SentNr",
52
+ "RcvNr",
53
+ "M1",
54
+ "M2",
55
+ "PTS",
56
+ ]
57
+ cabrillo_name = "XMAS"
58
+
59
+ advance_on_space = [True, True, True, True, True]
60
+
61
+ # 1 once per contest, 2 work each band, 3 each band/mode, 4 no dupe checking
62
+ dupe_type = 3
63
+
64
+
65
+ def init_contest(self):
66
+ """setup plugin"""
67
+ set_tab_next(self)
68
+ set_tab_prev(self)
69
+ interface(self)
70
+ self.next_field = self.other_2
71
+
72
+
73
+ def interface(self):
74
+ """Setup user interface"""
75
+ self.field1.show()
76
+ self.field2.show()
77
+ self.field3.show()
78
+ self.field4.show()
79
+ self.snt_label.setText("SNT")
80
+ label = self.field3.findChild(QtWidgets.QLabel)
81
+ label.setText("DOK/# Sent")
82
+ self.field3.setAccessibleName("RST Sent")
83
+ label = self.field4.findChild(QtWidgets.QLabel)
84
+ label.setText("DOK/# RCVD")
85
+ self.field4.setAccessibleName("DOK/NM or Number")
86
+
87
+
88
+ def reset_label(self):
89
+ """reset label after field cleared"""
90
+
91
+
92
+ def set_tab_next(self):
93
+ """Set TAB Advances"""
94
+ self.tab_next = {
95
+ self.callsign: self.field1.findChild(QtWidgets.QLineEdit),
96
+ self.field1.findChild(QtWidgets.QLineEdit): self.field2.findChild(
97
+ QtWidgets.QLineEdit
98
+ ),
99
+ self.field2.findChild(QtWidgets.QLineEdit): self.field3.findChild(
100
+ QtWidgets.QLineEdit
101
+ ),
102
+ self.field3.findChild(QtWidgets.QLineEdit): self.field4.findChild(
103
+ QtWidgets.QLineEdit
104
+ ),
105
+ self.field4.findChild(QtWidgets.QLineEdit): self.callsign,
106
+ }
107
+
108
+
109
+ def set_tab_prev(self):
110
+ """Set TAB Advances"""
111
+ self.tab_prev = {
112
+ self.callsign: self.field4.findChild(QtWidgets.QLineEdit),
113
+ self.field1.findChild(QtWidgets.QLineEdit): self.callsign,
114
+ self.field2.findChild(QtWidgets.QLineEdit): self.field1.findChild(
115
+ QtWidgets.QLineEdit
116
+ ),
117
+ self.field3.findChild(QtWidgets.QLineEdit): self.field2.findChild(
118
+ QtWidgets.QLineEdit
119
+ ),
120
+ self.field4.findChild(QtWidgets.QLineEdit): self.field3.findChild(
121
+ QtWidgets.QLineEdit
122
+ ),
123
+ }
124
+
125
+
126
+ def set_contact_vars(self):
127
+ """Contest Specific"""
128
+ self.contact["SNT"] = self.sent.text()
129
+ self.contact["RCV"] = self.receive.text()
130
+ self.contact["NR"] = self.other_2.text().upper()
131
+ self.contact["SentNr"] = self.other_1.text()
132
+ # self.contact["SentNr"] = self.contest_settings.get("SentExchange", "").upper()
133
+ dok = self.contact["NR"]
134
+
135
+ dxcc = self.contact.get("CountryPrefix", "")
136
+ band = self.contact.get("Band", "")
137
+
138
+ if dxcc == "DL" and not isinstance(dok, int) and dok.upper() != "NM":
139
+ query = (
140
+ f"select count(*) as dok_count from dxlog where 1=1 "
141
+ f"and NR = '{dok.upper()}' "
142
+ f"and Band = '{band}' "
143
+ f"and ContestNR = {self.pref.get('contest', '1')};"
144
+ )
145
+ result = self.database.exec_sql(query)
146
+ count = int(result.get("dok_count", 0))
147
+ if count == 0:
148
+ self.contact["IsMultiplier2"] = 1
149
+ else:
150
+ self.contact["IsMultiplier2"] = 0
151
+
152
+ if self.contact.get("WPXPrefix", ""):
153
+ result = self.database.fetch_wpx_exists(self.contact.get("WPXPrefix", ""))
154
+ if result.get("wpx_count", ""):
155
+ self.contact["IsMultiplier1"] = 0
156
+ else:
157
+ self.contact["IsMultiplier1"] = 1
158
+
159
+
160
+ def predupe(self):
161
+ """prefill his exchange with last known values"""
162
+
163
+
164
+ def prefill(self):
165
+ """Fill SentNR"""
166
+ field = self.field3.findChild(QtWidgets.QLineEdit)
167
+ sent_sxchange_setting = self.contest_settings.get("SentExchange", "")
168
+ if sent_sxchange_setting.strip() == "#":
169
+ result = self.database.get_serial()
170
+ serial_nr = str(result.get("serial_nr", "1")).zfill(3)
171
+ if serial_nr == "None":
172
+ serial_nr = "001"
173
+ field = self.field3.findChild(QtWidgets.QLineEdit)
174
+ if len(field.text()) == 0:
175
+ field.setText(serial_nr)
176
+ else:
177
+ field.setText(sent_sxchange_setting)
178
+
179
+ if self.other_2.text() == "":
180
+ call = self.callsign.text().upper()
181
+ query = f"select NR from dxlog where Call = '{call}' and ContestName = 'XMAS' order by ts desc;"
182
+ logger.debug(query)
183
+ result = self.database.exec_sql(query)
184
+ logger.debug("%s", f"{result}")
185
+ if result:
186
+ if isinstance(result.get("NR", ""), str):
187
+ self.other_2.setText(str(result.get("NR", "")))
188
+
189
+
190
+ def points(self):
191
+ """Calc point"""
192
+ return 1
193
+
194
+
195
+ def show_mults(self):
196
+ """Return display string for mults"""
197
+ return int(self.database.fetch_mult_count(1).get("count", 0)) + int(
198
+ self.database.fetch_mult_count(2).get("count", 0)
199
+ )
200
+
201
+
202
+ def show_qso(self):
203
+ """Return qso count"""
204
+ result = self.database.fetch_qso_count()
205
+ if result:
206
+ return int(result.get("qsos", 0))
207
+ return 0
208
+
209
+
210
+ def calc_score(self):
211
+ """Return calculated score"""
212
+ result = self.database.fetch_points()
213
+ if result is not None:
214
+ score = result.get("Points", "0")
215
+ if score is None:
216
+ score = "0"
217
+ contest_points = int(score)
218
+ mults = show_mults(self)
219
+ return contest_points * mults
220
+ return 0
221
+
222
+
223
+ def adif(self):
224
+ """Call the generate ADIF function"""
225
+ gen_adif(self, cabrillo_name, "XMAS")
226
+
227
+
228
+ def output_cabrillo_line(line_to_output, ending, file_descriptor, file_encoding):
229
+ """"""
230
+ print(
231
+ line_to_output.encode(file_encoding, errors="ignore").decode(),
232
+ end=ending,
233
+ file=file_descriptor,
234
+ )
235
+
236
+
237
+ def cabrillo(self, file_encoding):
238
+ """Generates Cabrillo file. Maybe."""
239
+ # https://www.cqwpx.com/cabrillo.htm
240
+ logger.debug("******Cabrillo*****")
241
+ logger.debug("Station: %s", f"{self.station}")
242
+ logger.debug("Contest: %s", f"{self.contest_settings}")
243
+ now = datetime.datetime.now()
244
+ date_time = now.strftime("%Y-%m-%d_%H-%M-%S")
245
+ filename = (
246
+ str(Path.home())
247
+ + "/"
248
+ + f"{self.station.get('Call', '').upper()}_{cabrillo_name}_{date_time}.log"
249
+ )
250
+ logger.debug("%s", filename)
251
+ log = self.database.fetch_all_contacts_asc()
252
+ try:
253
+ with open(filename, "w", encoding=file_encoding) as file_descriptor:
254
+ output_cabrillo_line(
255
+ "START-OF-LOG: 3.0",
256
+ "\r\n",
257
+ file_descriptor,
258
+ file_encoding,
259
+ )
260
+ output_cabrillo_line(
261
+ f"CREATED-BY: Not1MM v{__version__}",
262
+ "\r\n",
263
+ file_descriptor,
264
+ file_encoding,
265
+ )
266
+ output_cabrillo_line(
267
+ f"CONTEST: {cabrillo_name}",
268
+ "\r\n",
269
+ file_descriptor,
270
+ file_encoding,
271
+ )
272
+ if self.station.get("Club", ""):
273
+ output_cabrillo_line(
274
+ f"CLUB: {self.station.get('Club', '').upper()}",
275
+ "\r\n",
276
+ file_descriptor,
277
+ file_encoding,
278
+ )
279
+ output_cabrillo_line(
280
+ f"CALLSIGN: {self.station.get('Call','')}",
281
+ "\r\n",
282
+ file_descriptor,
283
+ file_encoding,
284
+ )
285
+ output_cabrillo_line(
286
+ f"LOCATION: {self.station.get('ARRLSection', '')}",
287
+ "\r\n",
288
+ file_descriptor,
289
+ file_encoding,
290
+ )
291
+ output_cabrillo_line(
292
+ f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
293
+ "\r\n",
294
+ file_descriptor,
295
+ file_encoding,
296
+ )
297
+ output_cabrillo_line(
298
+ f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
299
+ "\r\n",
300
+ file_descriptor,
301
+ file_encoding,
302
+ )
303
+ output_cabrillo_line(
304
+ f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
305
+ "\r\n",
306
+ file_descriptor,
307
+ file_encoding,
308
+ )
309
+ output_cabrillo_line(
310
+ f"CATEGORY-MODE: {self.contest_settings.get('ModeCategory','')}",
311
+ "\r\n",
312
+ file_descriptor,
313
+ file_encoding,
314
+ )
315
+ output_cabrillo_line(
316
+ f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
317
+ "\r\n",
318
+ file_descriptor,
319
+ file_encoding,
320
+ )
321
+ if self.contest_settings.get("OverlayCategory", "") != "N/A":
322
+ output_cabrillo_line(
323
+ f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
324
+ "\r\n",
325
+ file_descriptor,
326
+ file_encoding,
327
+ )
328
+ output_cabrillo_line(
329
+ f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
330
+ "\r\n",
331
+ file_descriptor,
332
+ file_encoding,
333
+ )
334
+ output_cabrillo_line(
335
+ f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
336
+ "\r\n",
337
+ file_descriptor,
338
+ file_encoding,
339
+ )
340
+
341
+ output_cabrillo_line(
342
+ f"CLAIMED-SCORE: {calc_score(self)}",
343
+ "\r\n",
344
+ file_descriptor,
345
+ file_encoding,
346
+ )
347
+ ops = f"@{self.station.get('Call','')}"
348
+ list_of_ops = self.database.get_ops()
349
+ for op in list_of_ops:
350
+ ops += f", {op.get('Operator', '')}"
351
+ output_cabrillo_line(
352
+ f"OPERATORS: {ops}",
353
+ "\r\n",
354
+ file_descriptor,
355
+ file_encoding,
356
+ )
357
+ output_cabrillo_line(
358
+ f"NAME: {self.station.get('Name', '')}",
359
+ "\r\n",
360
+ file_descriptor,
361
+ file_encoding,
362
+ )
363
+ output_cabrillo_line(
364
+ f"ADDRESS: {self.station.get('Street1', '')}",
365
+ "\r\n",
366
+ file_descriptor,
367
+ file_encoding,
368
+ )
369
+ output_cabrillo_line(
370
+ f"ADDRESS-CITY: {self.station.get('City', '')}",
371
+ "\r\n",
372
+ file_descriptor,
373
+ file_encoding,
374
+ )
375
+ output_cabrillo_line(
376
+ f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
377
+ "\r\n",
378
+ file_descriptor,
379
+ file_encoding,
380
+ )
381
+ output_cabrillo_line(
382
+ f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
383
+ "\r\n",
384
+ file_descriptor,
385
+ file_encoding,
386
+ )
387
+ output_cabrillo_line(
388
+ f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
389
+ "\r\n",
390
+ file_descriptor,
391
+ file_encoding,
392
+ )
393
+ output_cabrillo_line(
394
+ f"EMAIL: {self.station.get('Email', '')}",
395
+ "\r\n",
396
+ file_descriptor,
397
+ file_encoding,
398
+ )
399
+ for contact in log:
400
+ the_date_and_time = contact.get("TS", "")
401
+ themode = contact.get("Mode", "")
402
+ if themode == "LSB" or themode == "USB":
403
+ themode = "PH"
404
+ frequency = str(int(contact.get("Freq", "0"))).rjust(5)
405
+
406
+ loggeddate = the_date_and_time[:10]
407
+ loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
408
+ output_cabrillo_line(
409
+ f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
410
+ f"{contact.get('StationPrefix', '').ljust(13)} "
411
+ f"{str(contact.get('SNT', '')).ljust(3)} "
412
+ f"{str(contact.get('SentNr', '')).ljust(6)} "
413
+ f"{contact.get('Call', '').ljust(13)} "
414
+ f"{str(contact.get('RCV', '')).ljust(3)} "
415
+ f"{str(contact.get('NR', '')).ljust(6)}",
416
+ "\r\n",
417
+ file_descriptor,
418
+ file_encoding,
419
+ )
420
+ output_cabrillo_line("END-OF-LOG:", "\r\n", file_descriptor, file_encoding)
421
+ self.show_message_box(f"Cabrillo saved to: {filename}")
422
+ except IOError as exception:
423
+ logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
424
+ self.show_message_box(f"Error saving Cabrillo: {exception} {filename}")
425
+ return
426
+
427
+
428
+ def recalculate_mults(self):
429
+ """Recalculates multipliers after change in logged qso."""
430
+
431
+ all_contacts = self.database.fetch_all_contacts_asc()
432
+ for contact in all_contacts:
433
+
434
+ contact["IsMultiplier1"] = 0
435
+ contact["IsMultiplier2"] = 0
436
+
437
+ time_stamp = contact.get("TS", "")
438
+ dok = contact.get("NR", "")
439
+ dxcc = contact.get("CountryPrefix", "")
440
+ band = contact.get("Band", "")
441
+ wpx = contact.get("WPXPrefix", "")
442
+ result = self.database.fetch_wpx_exists_before_me(wpx, time_stamp)
443
+ wpx_count = result.get("wpx_count", 1)
444
+ if wpx_count == 0:
445
+ contact["IsMultiplier1"] = 1
446
+ else:
447
+ contact["IsMultiplier1"] = 0
448
+
449
+ if dxcc == "DL" and not isinstance(dok, int) and dok.upper() != "NM":
450
+ query = (
451
+ f"select count(*) as dok_count from dxlog where TS < '{time_stamp}' "
452
+ f"and NR = '{dok.upper()}' "
453
+ f"and Band = '{band}' "
454
+ f"and ContestNR = {self.pref.get('contest', '1')};"
455
+ )
456
+ result = self.database.exec_sql(query)
457
+ count = int(result.get("dok_count", 0))
458
+ if count == 0:
459
+ contact["IsMultiplier2"] = 1
460
+ else:
461
+ contact["IsMultiplier2"] = 0
462
+ self.database.change_contact(contact)
463
+
464
+
465
+ def process_esm(self, new_focused_widget=None, with_enter=False):
466
+ """ESM State Machine"""
467
+
468
+ # self.pref["run_state"]
469
+
470
+ # -----===== Assigned F-Keys =====-----
471
+ # self.esm_dict["CQ"]
472
+ # self.esm_dict["EXCH"]
473
+ # self.esm_dict["QRZ"]
474
+ # self.esm_dict["AGN"]
475
+ # self.esm_dict["HISCALL"]
476
+ # self.esm_dict["MYCALL"]
477
+ # self.esm_dict["QSOB4"]
478
+
479
+ # ----==== text fields ====----
480
+ # self.callsign
481
+ # self.sent
482
+ # self.receive
483
+ # self.other_1
484
+ # self.other_2
485
+
486
+ if new_focused_widget is not None:
487
+ self.current_widget = self.inputs_dict.get(new_focused_widget)
488
+
489
+ # print(f"checking esm {self.current_widget=} {with_enter=} {self.pref.get("run_state")=}")
490
+
491
+ for a_button in [
492
+ self.F1,
493
+ self.F2,
494
+ self.F3,
495
+ self.F4,
496
+ self.F5,
497
+ self.F6,
498
+ self.F7,
499
+ self.F8,
500
+ self.F9,
501
+ self.F10,
502
+ self.F11,
503
+ self.F12,
504
+ ]:
505
+ self.restore_button_color(a_button)
506
+
507
+ buttons_to_send = []
508
+
509
+ if self.pref.get("run_state"):
510
+ if self.current_widget == "callsign":
511
+ if len(self.callsign.text()) < 3:
512
+ self.make_button_green(self.esm_dict["CQ"])
513
+ buttons_to_send.append(self.esm_dict["CQ"])
514
+ elif len(self.callsign.text()) > 2:
515
+ self.make_button_green(self.esm_dict["HISCALL"])
516
+ self.make_button_green(self.esm_dict["EXCH"])
517
+ buttons_to_send.append(self.esm_dict["HISCALL"])
518
+ buttons_to_send.append(self.esm_dict["EXCH"])
519
+
520
+ elif self.current_widget in ["other_1", "other_2"]:
521
+ if self.other_2.text() == "" or self.other_1.text() == "":
522
+ self.make_button_green(self.esm_dict["AGN"])
523
+ buttons_to_send.append(self.esm_dict["AGN"])
524
+ else:
525
+ self.make_button_green(self.esm_dict["QRZ"])
526
+ buttons_to_send.append(self.esm_dict["QRZ"])
527
+ buttons_to_send.append("LOGIT")
528
+
529
+ if with_enter is True and bool(len(buttons_to_send)):
530
+ for button in buttons_to_send:
531
+ if button:
532
+ if button == "LOGIT":
533
+ self.save_contact()
534
+ continue
535
+ self.process_function_key(button)
536
+ else:
537
+ if self.current_widget == "callsign":
538
+ if len(self.callsign.text()) > 2:
539
+ self.make_button_green(self.esm_dict["MYCALL"])
540
+ buttons_to_send.append(self.esm_dict["MYCALL"])
541
+
542
+ elif self.current_widget in ["other_1", "other_2"]:
543
+ if self.other_2.text() == "" or self.other_1.text() == "":
544
+ self.make_button_green(self.esm_dict["AGN"])
545
+ buttons_to_send.append(self.esm_dict["AGN"])
546
+ else:
547
+ self.make_button_green(self.esm_dict["EXCH"])
548
+ buttons_to_send.append(self.esm_dict["EXCH"])
549
+ buttons_to_send.append("LOGIT")
550
+
551
+ if with_enter is True and bool(len(buttons_to_send)):
552
+ for button in buttons_to_send:
553
+ if button:
554
+ if button == "LOGIT":
555
+ self.save_contact()
556
+ continue
557
+ self.process_function_key(button)
558
+
559
+
560
+ def populate_history_info_line(self):
561
+ result = self.database.fetch_call_history(self.callsign.text())
562
+ if result:
563
+ self.history_info.setText(
564
+ f"{result.get('Call', '')}, {result.get('Name', '')}, {result.get('Exch1', '')}, {result.get('UserText','...')}"
565
+ )
566
+ else:
567
+ self.history_info.setText("")
568
+
569
+
570
+ def check_call_history(self):
571
+ """"""
572
+ result = self.database.fetch_call_history(self.callsign.text())
573
+ if result:
574
+ self.history_info.setText(f"{result.get('UserText','')}")
575
+ if self.other_1.text() == "":
576
+ self.other_1.setText(f"{result.get('Exch1', '')}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: not1mm
3
- Version: 24.11.17
3
+ Version: 24.11.18
4
4
  Summary: NOT1MM Logger
5
5
  Author-email: Michael Bridak <michael.bridak@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/mbridak/not1mm
@@ -219,12 +219,14 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
219
219
  - **CQ WPX CW, RTTY, SSB**
220
220
  - **CQ World Wide CW, RTTY, SSB**
221
221
  - **CWOps CWT**
222
+ - **DARC Xmas**
222
223
  - **Helvetia**
223
224
  - IARU Fieldday R1 CW, SSB
224
225
  - IARU HF
225
226
  - ICWC MST
226
227
  - Japan International DX CW, SSB
227
228
  - **K1USN Slow Speed Test**
229
+ - **LZ DX**
228
230
  - **NAQP CW, RTTY, SSB**
229
231
  - Phone Weekly Test
230
232
  - **RAEM**
@@ -236,6 +238,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's.
236
238
 
237
239
  ## Recent Changes (Polishing the Turd)
238
240
 
241
+ - [24-11-18] Accepted PR from dg9vh for the DARC XMAS Contest.
239
242
  - [24-11-17] Accepted PR from dg9vh for the LZ DX contest.
240
243
  - [24-11-15] Made checkwindow font bigger and match a little more contrasted.
241
244
  - [24-11-12] add check for ipv4 address for CAT.
@@ -150,6 +150,7 @@ not1mm/plugins/cq_ww_cw.py
150
150
  not1mm/plugins/cq_ww_rtty.py
151
151
  not1mm/plugins/cq_ww_ssb.py
152
152
  not1mm/plugins/cwt.py
153
+ not1mm/plugins/darc_xmas.py
153
154
  not1mm/plugins/general_logging.py
154
155
  not1mm/plugins/helvetia.py
155
156
  not1mm/plugins/iaru_fieldday_r1_cw.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "not1mm"
7
- version = "24.11.17"
7
+ version = "24.11.18"
8
8
  description = "NOT1MM Logger"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"