-
-
Notifications
You must be signed in to change notification settings - Fork 402
/
NEWS
2634 lines (2170 loc) · 109 KB
/
NEWS
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
This file is used to auto-generate the "Changelog" section of Sopel's website.
When adding new entries, follow the style guide in NEWS.spec.md to avoid
causing problems with the site build.
Changes between 7.1.8 and 7.1.9
===============================
Plugin changes
--------------
* search: replace deprecated git.io link in messaging [[#2271][]]
* tell: fix exception when message is missing [[#2264][]]
[#2264]: https://github.com/sopel-irc/sopel/pull/2264
[#2271]: https://github.com/sopel-irc/sopel/pull/2271
Changes between 7.1.7 and 7.1.8
===============================
Plugin changes
--------------
* isup: ensure compatibility with newer `requests` versions [[#2235][]]
* reddit: handle image preview links [[#2245][]]
* search: per tests of both back-ends, warn more consistently about multiple
`site:` operators [[#2254][]]
* translate: fix accepting language hints for Chinese [[#2242][]]
* url:
* bump user-agent [[#2218][]]
* tweak logging levels to better reflect severity [[#2249][]]
* wikipedia: refine handling of sections with "hatnote" templates [[#2225][]]
* xkcd: improve reliability of comic search [[#2247][]]
Core changes
------------
* Formatting tweaks in IRC logging output [[#2250][]]
* Requirement tweaks to make sure installing on Python 3.4 still works
(but if you're still using that, *please* update your Python)
API changes
-----------
* Fix/improve more documentation [[#2251][]]
[#2218]: https://github.com/sopel-irc/sopel/pull/2218
[#2225]: https://github.com/sopel-irc/sopel/pull/2225
[#2235]: https://github.com/sopel-irc/sopel/pull/2235
[#2242]: https://github.com/sopel-irc/sopel/pull/2242
[#2245]: https://github.com/sopel-irc/sopel/pull/2245
[#2247]: https://github.com/sopel-irc/sopel/pull/2247
[#2249]: https://github.com/sopel-irc/sopel/pull/2249
[#2250]: https://github.com/sopel-irc/sopel/pull/2250
[#2251]: https://github.com/sopel-irc/sopel/pull/2251
[#2254]: https://github.com/sopel-irc/sopel/pull/2254
Changes between 7.1.6 and 7.1.7
===============================
Plugin changes
--------------
* adminchannel: fix a very old bug in NUH (hostmask) handling [[#2221][]]
* reddit:
* add flair text to submission output [[#2209][]]
* further improve link matching [[#2208][], [#2216][]]
* wiktionary: correctly handle multi-paragraph etymologies [[#2214][]]
Core changes
------------
* Added an alert if the IRC server registers the bot as a client using a
different nickname than what's set in `core.nick` [[#2215][]]
[#2208]: https://github.com/sopel-irc/sopel/pull/2208
[#2209]: https://github.com/sopel-irc/sopel/pull/2209
[#2214]: https://github.com/sopel-irc/sopel/pull/2214
[#2215]: https://github.com/sopel-irc/sopel/pull/2215
[#2216]: https://github.com/sopel-irc/sopel/pull/2216
[#2221]: https://github.com/sopel-irc/sopel/pull/2221
Changes between 7.1.5 and 7.1.6
===============================
Plugin changes
--------------
* reddit: fix regression in shortlink (`redd.it/<postID>`) handling [[#2201][]]
* url: fix tripping on HTML character entities like `'` if running on
Python 3.4+ [[#2204][]]
* wikipedia: add mobile links to URL handling [[#2201][]]
Core changes
------------
* Detect UTF-8 locale on Windows [[#2174][]]
API changes
-----------
* `web.decode()`: use Python's built-in HTML character entity decoder if
available [[#2204][]]
* Fix minor documentation error [[#2196][]]
[#2174]: https://github.com/sopel-irc/sopel/pull/2174
[#2196]: https://github.com/sopel-irc/sopel/pull/2196
[#2201]: https://github.com/sopel-irc/sopel/pull/2201
[#2202]: https://github.com/sopel-irc/sopel/pull/2202
[#2204]: https://github.com/sopel-irc/sopel/pull/2204
Changes between 7.1.4 and 7.1.5
===============================
Since 7.1.4 was released, an [expiring TLS root certificate][le-expiration]
caused us some problems in the old CI system we're still using for Sopel 7.1.x
to run tests against EOL versions of Python. Our workaround in [#2192][]
(basically "Workaround 1" from [this OpenSSL blog post][openssl-102-fixes])
might be of use to anyone still running Sopel on an old system.
Core changes
------------
* Fixed incorrect behavior during unrecognized SASL authentication [[#2190][]]
* Ignore case when checking config sections for "defined" settings [[#2193][]]
[#2190]: https://github.com/sopel-irc/sopel/pull/2190
[#2192]: https://github.com/sopel-irc/sopel/pull/2192
[#2193]: https://github.com/sopel-irc/sopel/pull/2193
[le-expiration]: https://letsencrypt.org/2021/10/01/cert-chaining-help.html
[openssl-102-fixes]: https://www.openssl.org/blog/blog/2021/09/13/LetsEncryptRootCertExpire/
Changes between 7.1.3 and 7.1.4
===============================
Plugin changes
--------------
* reddit: prevent comment links from also displaying post info [[#2176][]]
[#2176]: https://github.com/sopel-irc/sopel/pull/2176
Changes between 7.1.2 and 7.1.3
===============================
Plugin changes
--------------
* announce: fix Python 3 compatibility [[#2166][]]
* reddit: fix handling post links with parameters, e.g. sorting [[#2163][]]
* reddit: silence PRAW update notices [[#2171][]]
* tell: don't strip IRC formatting at message start [[#2162][]]
* translate: better error handling in `.mangle` [[#2160][]]
* wikipedia: skip messagebox template contents for cleaner snippets [[#2159][]]
* wikipedia: improve handling of links to transcluded sections [[#2168][]]
Core changes
------------
* Fixed showing plugin information in `sopel-plugins` CLI tool even if loading
the plugin fails [[#2135][]]
* Stop warning about `parse == bool` configuration settings in 7.x [[#2164][]]
* This warning will return in Sopel 8.0, a major release which will be a
more natural time for plugin maintainers to release compatibility updates.
* Fixed `requests` requirement on Python 3.3 [[#2172][]]
[#2135]: https://github.com/sopel-irc/sopel/pull/2135
[#2159]: https://github.com/sopel-irc/sopel/pull/2159
[#2160]: https://github.com/sopel-irc/sopel/pull/2160
[#2162]: https://github.com/sopel-irc/sopel/pull/2162
[#2163]: https://github.com/sopel-irc/sopel/pull/2163
[#2164]: https://github.com/sopel-irc/sopel/pull/2164
[#2166]: https://github.com/sopel-irc/sopel/pull/2166
[#2168]: https://github.com/sopel-irc/sopel/pull/2168
[#2171]: https://github.com/sopel-irc/sopel/pull/2171
[#2172]: https://github.com/sopel-irc/sopel/pull/2172
Changes between 7.1.1 and 7.1.2
===============================
Plugin changes
--------------
* invite: handle invalid arguments better [[#2151][]]
* translate: handle failed API requests better [[#2153][]]
* wikipedia: warn if deprecated `lang_per_channel` setting is used [[#2143][]]
Core changes
------------
* Clarified documentation about `owner` and `owner_account` settings in core
config section [[#2112][], [#2125][]]
[#2112]: https://github.com/sopel-irc/sopel/pull/2112
[#2125]: https://github.com/sopel-irc/sopel/pull/2125
[#2143]: https://github.com/sopel-irc/sopel/pull/2143
[#2151]: https://github.com/sopel-irc/sopel/pull/2151
[#2153]: https://github.com/sopel-irc/sopel/pull/2153
Changes between 7.1.0 and 7.1.1
===============================
Plugin changes
--------------
* safety: fixed loading bad-domains list on py2 [[#2103][]]
* tell: fixed hard-coded verb when trying to `.ask` the bot [[#2106][]]
* tld: fixed `.tldcache clear` command corrupting internal state [[#2077][]]
Core changes
------------
* Fixed `BooleanAttribute` with `default=True` [[#2084][]]
* Ignore invalid URLs when triggering URL callbacks [[#2086][]]
* Fixed infinite loop in WHO tracking on certain networks [[#2091][]]
* Ignore problematic environment variables in tests [[#2094][]]
* Improved MODE tracking even more [[#2097][], [#2098][]]
* Updated, clarified, and expanded even more documentation [[#2090][],
[#2096][], [#2105][], [#2108][]]
[#2077]: https://github.com/sopel-irc/sopel/pull/2077
[#2084]: https://github.com/sopel-irc/sopel/pull/2084
[#2086]: https://github.com/sopel-irc/sopel/pull/2086
[#2090]: https://github.com/sopel-irc/sopel/pull/2090
[#2091]: https://github.com/sopel-irc/sopel/pull/2091
[#2094]: https://github.com/sopel-irc/sopel/pull/2094
[#2096]: https://github.com/sopel-irc/sopel/pull/2096
[#2097]: https://github.com/sopel-irc/sopel/pull/2097
[#2098]: https://github.com/sopel-irc/sopel/pull/2098
[#2103]: https://github.com/sopel-irc/sopel/pull/2103
[#2105]: https://github.com/sopel-irc/sopel/pull/2105
[#2106]: https://github.com/sopel-irc/sopel/pull/2106
[#2108]: https://github.com/sopel-irc/sopel/pull/2108
Changes between 7.0.7 and 7.1.0
===============================
Admittedly a few _months_ later than originally intended, Sopel 7.1.0 is ready
to go. We've focused on polish this time around, both in documentation and
features. Lots of little fixes add up to make something good—over 140 pull
requests were merged for this release.
We will now begin work on Sopel 8.0, focusing primarily on
modernization—dropping the end-of-life Python versions that 7.x still
supports—and on unbundling the core plugins so they can be updated separately.
None of these plans are new, but we figured a reminder was in order as it's
been some months since they last came up in Sopel 7.0's release notes!
As always, you can keep up with development and give us feedback on
[GitHub][sopel-github], [IRC][sopel-irc], or [Twitter][sopel-twitter].
**Important note:** Sopel's IRC channel has moved from freenode to Libera Chat
([#2072][]). You will find us in `#sopel` as always, but at a new network
address: `irc.libera.chat`. At least some of the old guard will remain on
freenode for the foreseeable future, to guide anyone running an older Sopel
version to the new channel (and encourage them to update Sopel, too).
Plugin changes
--------------
* Removed `instagram` plugin, as it was not possible to fix after changes to
the site [[#2000][]]
* Merged `etymology` plugin functionality into `wiktionary` plugin [[#1178][],
[#2064][]]
* admin:
* reply on save [[#1913][]]
* add `.chanlist` command to show Sopel's channel memberships [[#1961][]]
* adminchannel:
* use `TOPICLEN` if server advertises it [[#1956][]]
* allow non-op `.topic` in channels without mode `+t` [[#1981][]]
* announce: speed up by sending to multiple channels if the server supports it
[[#1859][], [#2048][]]
* choose: safely handle formatted choices [[#1965][]]
* currency:
* added thousands separator & better handling of small numbers [[#1988][]]
* improved error handling [[#2053][]]
* updated API endpoints [[#1988][], [#2060][], [#2074][]]
* emoticons: added `.smirk` command & action responses [[#1899][]]
* find: accept either `/` or `|` as delimiter, and format replacement text as
**bold** so it's easier to see the correction [[#1993][], [#2014][],
[#2066][]]
* find_updates:
* prepare to handle unstable releases again [[#1955][]]
* improve error handling [[#2052][], [#2056][]]
* ip: querying by nickname is no longer case-sensitive [[#1915][]]
* isup: be more specific about what's wrong if the site looks down [[#1940][],
[#1950][], [#2063][]]
* meetbot: tweaked handling of path settings [[#1959][]]
* ping: added `.ping` command [[#1875][]]
* pronouns: now understands two-word aliases for the full pronoun groups
[[#2069][]]
* reddit:
* added handling for `r/all` and `r/popular` [[#1763][]]
* fixed incorrect behavior in `r/` and `u/` handling [[#1889][]]
* added basic handling for gallery view [[#1914][]]
* fixed a floating-point issue [[#1987][]]
* fixed grammar [[#2025][]]
* remind: added commands to count/forget reminders [[#2007][]]
* safety: switched away from obsolete list source [[#2012][]]
* tell: strip `@` from the start of nicknames [[#1994][]]
* tld: rewritten to be more robust [[#1939][], [#1949][], [#1968][],
[#1970][], [#1985][], [#2076][]]
* url:
* tweaked to improve reliability of title fetching [[#1871][]]
* added a setting to control automatic titles [[#1897][]]
* adapted to upstream dependency changes [[#1989][]]
* add `.urlexclude`/`.urlallow` commands [[#2028][]]
* auto-title now ignores URLs in _any_ other command [[#2028][]]
* fixed showing an error when appropriate [[#2029][]]
* wikipedia:
* can now fetch section snippets [[#1163][]]
* language preferences per-channel and per-nick are now stored in the
database, and manageable with commands [[#1916][]]
* xkcd: show latest comic when base URL is linked [[#1858][]]
* Built-in plugins' output formats were checked for consistency [[#1937][]]
* Improved plugin documentation/help [[#1878][], [#1952][], [#1954][],
[#2002][], [#2035][]]
* Updated some plugins to use new API features [[#1879][], [#1892][],
[#1894][], [#1995][]]
* Minor code style fixes and cleanup [[#1856][], [#1880][], [#1910][],
[#1953][], [#1960][]]
Core changes
------------
* Sopel's outbound flooding protection is now configurable [[#1929][]]
* `core.modes` setting now only assumes `+` if no sign is included in its
value [[#1941][]]
* Improved documentation of core configuration settings [[#1861][], [#1866][],
[#2006][]]
* Documented use of environment variables to override parts of Sopel's
configuration [[#1901][]]
* Also fixed some broken functionality related to this feature [[#1882][],
[#1900][]]
* Improved command-line error messages [[#2047][]]
* Unexpected settings in config files will now generate warnings [[#1973][]]
* Improved SASL handling [[#1928][], [#1971][], [#1976][], [#1977][]]
* Change/recover in-use nick; fix `USER` syntax [[#1930][]]
* Improved channel mode tracking [[#1980][]]
* Improved channel member tracking [[#1997][]]
* Reduced log spam from core `MODE` handling logic [[#1951][]]
* Refactored the Rule system [[#1873][], [#1894][], [#1904][], [#2011][]]
* Reworked IRC connection timeout management [[#2041][]]
* Fixed loading callables that should be ignored from plugins [[#1936][]]
* Streamlined how the bot generates help text for plugin commands [[#2071][]]
* Fixed signal handling (e.g. `^C`) if bot is not connected [[#1893][]]
* Fixed crash if a plugin tries to `sys.exit()` [[#1943][]]
* Fixed crash if IRC backend is uninitialized and logging to a channel is
enabled [[#2020][]]
* Improved scheduled job handling [[#1891][], [#1927][]]
* Improved test coverage [[#1983][], [#1984][]]
* Improved test infrastructure [[#1905][]]
* Minor code style fixes and refactoring [[#1864][], [#1890][], [#1933][],
[#1942][], [#1969][], [#1998][], [#2005][], [#2023][]]
API changes
-----------
* Moved plugin decorators to `sopel.plugin`; `sopel.module` is now deprecated
[[#1898][], [#1906][], [#1924][], [#1967][]]
* Decorators that are new in Sopel 7.1 or later will appear only in
`sopel.plugin`; `sopel.module` contains only a snapshot of what was
available in Sopel 7.0 and will not be updated
* The old `sopel.module` imports will be removed in Sopel 9.0
* The `intent` decorator is replaced by `ctcp`, and `trigger` objects now have
a `ctcp` property [[#1975][]]
* "Intents" were an IRCv3 spec idea that never took off, and the draft specs
for them are now long abandoned
* See [#1683][] for the full deprecation and removal plan
* `sopel.tools` functions related to command patterns/regex are now deprecated
[[#1944][], [#2027][], [#2034][]]
* `tools.get_input` is now deprecated [[#1872][]]
* `bot.(un)register_url_callback` functions are deprecated [[#2049][]]
* These are simply no longer necessary after the Rule system rewrite
* `test_tools` submodule is now deprecated [[#2003][]]
* Sopel now provides a `pytest` plugin; use that instead
* The use of whitespace after `$nick` placeholders in plugin rules is now less
confusing [[#1920][]]
* Sopel now explicitly supports running plugins' event handlers before/after
core has processed the event [[#2018][]]
* Added more tools related to `tools.time.seconds_to_human` [[#2026][]]
* Added a warning when plugins use `bot.memory['url_callbacks']` [[#2033][]]
* Added `SopelIdentifierMemory` class to `tools` [[#1938][]]
* This offers a less error-prone alternative to using a plain `SopelMemory`,
which often requires manually casting user input to the `Identifier` type
* New `plugin.require_bot_privilege` decorator and `bot.has_channel_privilege`
method [[#1982][]]
* Added `plugin.find` and `plugin.search` decorators [[#1881][]]
* Added `plugin.rule_lazy`, `plugin.find_lazy`, and `plugin.search_lazy`
decorators [[#2037][]]
* These are for plugins to define rules that depend on the contents of
Sopel's settings object (`bot.config`)
* `bot.say` now allows even more control over variable-length content via
optional `truncation` and `trailing` parameters [[#1958][], [#2050][]]
* `bot.trigger` now has a `plain` attribute, containing the received line with
formatting stripped [[#1918][]]
* `Channel` objects now contain information about channel modes [[#1980][]]
* Added a `BooleanAttribute` setting type [[#2044][], [#2059][]]
* Use of `ValidatedAttribute` with `parse=bool` is now considered deprecated
so we can remove the monkey-patching in a future release, and will raise a
warning if used
* Added a `SecretAttribute` setting type, and `is_secret` parameter to
`ValidatedAttribute` [[#1879][]]
* `plugin.example` now supports running plugin tests with [VCR.py][pypi-vcrpy]
support [[#1853][]]
* `bot.isupport` will return an empty `CHANMODES` if unadvertised [[#2015][]]
* Make `tools.time` and `tools.web` submodules available with just `from sopel
import tools` [[#1948][]]
* Added new optional `warning_in` and `stack_frame` parameters to the
`tools.deprecated` decorator, which now outputs its warning via logging
[[#1872][], [#2046][], [#2058][]]
* `MockIRCServer` methods now block by default [[#2065][]]
* Improved documentation for writing & testing plugins [[#1923][], [#1964][],
[#2013][], [#2067][]]
* Improved documentation of various Sopel components:
* `bot` [[#1857][]]
* `cli` [[#1922][]]
* `coretasks` [[#2001][]]
* `loader` [[#2004][]]
* `plugins` [[#1902][]]
* Tweaked documentation styles for easier readability [[#1932][]]
* Note: We plan to change the documentation theme entirely for Sopel 8, to
something much more modern
[#1163]: https://github.com/sopel-irc/sopel/pull/1163
[#1178]: https://github.com/sopel-irc/sopel/pull/1178
[#1763]: https://github.com/sopel-irc/sopel/pull/1763
[#1853]: https://github.com/sopel-irc/sopel/pull/1853
[#1856]: https://github.com/sopel-irc/sopel/pull/1856
[#1857]: https://github.com/sopel-irc/sopel/pull/1857
[#1858]: https://github.com/sopel-irc/sopel/pull/1858
[#1859]: https://github.com/sopel-irc/sopel/pull/1859
[#1861]: https://github.com/sopel-irc/sopel/pull/1861
[#1864]: https://github.com/sopel-irc/sopel/pull/1864
[#1866]: https://github.com/sopel-irc/sopel/pull/1866
[#1871]: https://github.com/sopel-irc/sopel/pull/1871
[#1872]: https://github.com/sopel-irc/sopel/pull/1872
[#1873]: https://github.com/sopel-irc/sopel/pull/1873
[#1875]: https://github.com/sopel-irc/sopel/pull/1875
[#1878]: https://github.com/sopel-irc/sopel/pull/1878
[#1879]: https://github.com/sopel-irc/sopel/pull/1879
[#1880]: https://github.com/sopel-irc/sopel/pull/1880
[#1881]: https://github.com/sopel-irc/sopel/pull/1881
[#1882]: https://github.com/sopel-irc/sopel/pull/1882
[#1889]: https://github.com/sopel-irc/sopel/pull/1889
[#1890]: https://github.com/sopel-irc/sopel/pull/1890
[#1891]: https://github.com/sopel-irc/sopel/pull/1891
[#1892]: https://github.com/sopel-irc/sopel/pull/1892
[#1893]: https://github.com/sopel-irc/sopel/pull/1893
[#1894]: https://github.com/sopel-irc/sopel/pull/1894
[#1897]: https://github.com/sopel-irc/sopel/pull/1897
[#1898]: https://github.com/sopel-irc/sopel/pull/1898
[#1899]: https://github.com/sopel-irc/sopel/pull/1899
[#1900]: https://github.com/sopel-irc/sopel/pull/1900
[#1901]: https://github.com/sopel-irc/sopel/pull/1901
[#1902]: https://github.com/sopel-irc/sopel/pull/1902
[#1904]: https://github.com/sopel-irc/sopel/pull/1904
[#1905]: https://github.com/sopel-irc/sopel/pull/1905
[#1906]: https://github.com/sopel-irc/sopel/pull/1906
[#1910]: https://github.com/sopel-irc/sopel/pull/1910
[#1913]: https://github.com/sopel-irc/sopel/pull/1913
[#1914]: https://github.com/sopel-irc/sopel/pull/1914
[#1915]: https://github.com/sopel-irc/sopel/pull/1915
[#1916]: https://github.com/sopel-irc/sopel/pull/1916
[#1918]: https://github.com/sopel-irc/sopel/pull/1918
[#1920]: https://github.com/sopel-irc/sopel/pull/1920
[#1922]: https://github.com/sopel-irc/sopel/pull/1922
[#1923]: https://github.com/sopel-irc/sopel/pull/1923
[#1924]: https://github.com/sopel-irc/sopel/pull/1924
[#1927]: https://github.com/sopel-irc/sopel/pull/1927
[#1928]: https://github.com/sopel-irc/sopel/pull/1928
[#1929]: https://github.com/sopel-irc/sopel/pull/1929
[#1930]: https://github.com/sopel-irc/sopel/pull/1930
[#1932]: https://github.com/sopel-irc/sopel/pull/1932
[#1933]: https://github.com/sopel-irc/sopel/pull/1933
[#1936]: https://github.com/sopel-irc/sopel/pull/1936
[#1937]: https://github.com/sopel-irc/sopel/pull/1937
[#1938]: https://github.com/sopel-irc/sopel/pull/1938
[#1939]: https://github.com/sopel-irc/sopel/pull/1939
[#1940]: https://github.com/sopel-irc/sopel/pull/1940
[#1941]: https://github.com/sopel-irc/sopel/pull/1941
[#1942]: https://github.com/sopel-irc/sopel/pull/1942
[#1943]: https://github.com/sopel-irc/sopel/pull/1943
[#1944]: https://github.com/sopel-irc/sopel/pull/1944
[#1948]: https://github.com/sopel-irc/sopel/pull/1948
[#1949]: https://github.com/sopel-irc/sopel/pull/1949
[#1950]: https://github.com/sopel-irc/sopel/pull/1950
[#1951]: https://github.com/sopel-irc/sopel/pull/1951
[#1952]: https://github.com/sopel-irc/sopel/pull/1952
[#1953]: https://github.com/sopel-irc/sopel/pull/1953
[#1954]: https://github.com/sopel-irc/sopel/pull/1954
[#1955]: https://github.com/sopel-irc/sopel/pull/1955
[#1956]: https://github.com/sopel-irc/sopel/pull/1956
[#1958]: https://github.com/sopel-irc/sopel/pull/1958
[#1959]: https://github.com/sopel-irc/sopel/pull/1959
[#1960]: https://github.com/sopel-irc/sopel/pull/1960
[#1961]: https://github.com/sopel-irc/sopel/pull/1961
[#1964]: https://github.com/sopel-irc/sopel/pull/1964
[#1965]: https://github.com/sopel-irc/sopel/pull/1965
[#1967]: https://github.com/sopel-irc/sopel/pull/1967
[#1968]: https://github.com/sopel-irc/sopel/pull/1968
[#1969]: https://github.com/sopel-irc/sopel/pull/1969
[#1970]: https://github.com/sopel-irc/sopel/pull/1970
[#1971]: https://github.com/sopel-irc/sopel/pull/1971
[#1973]: https://github.com/sopel-irc/sopel/pull/1973
[#1975]: https://github.com/sopel-irc/sopel/pull/1975
[#1976]: https://github.com/sopel-irc/sopel/pull/1976
[#1977]: https://github.com/sopel-irc/sopel/pull/1977
[#1980]: https://github.com/sopel-irc/sopel/pull/1980
[#1981]: https://github.com/sopel-irc/sopel/pull/1981
[#1982]: https://github.com/sopel-irc/sopel/pull/1982
[#1983]: https://github.com/sopel-irc/sopel/pull/1983
[#1984]: https://github.com/sopel-irc/sopel/pull/1984
[#1985]: https://github.com/sopel-irc/sopel/pull/1985
[#1987]: https://github.com/sopel-irc/sopel/pull/1987
[#1988]: https://github.com/sopel-irc/sopel/pull/1988
[#1989]: https://github.com/sopel-irc/sopel/pull/1989
[#1993]: https://github.com/sopel-irc/sopel/pull/1993
[#1994]: https://github.com/sopel-irc/sopel/pull/1994
[#1995]: https://github.com/sopel-irc/sopel/pull/1995
[#1997]: https://github.com/sopel-irc/sopel/pull/1997
[#1998]: https://github.com/sopel-irc/sopel/pull/1998
[#2000]: https://github.com/sopel-irc/sopel/pull/2000
[#2001]: https://github.com/sopel-irc/sopel/pull/2001
[#2002]: https://github.com/sopel-irc/sopel/pull/2002
[#2003]: https://github.com/sopel-irc/sopel/pull/2003
[#2004]: https://github.com/sopel-irc/sopel/pull/2004
[#2005]: https://github.com/sopel-irc/sopel/pull/2005
[#2006]: https://github.com/sopel-irc/sopel/pull/2006
[#2007]: https://github.com/sopel-irc/sopel/pull/2007
[#2011]: https://github.com/sopel-irc/sopel/pull/2011
[#2012]: https://github.com/sopel-irc/sopel/pull/2012
[#2013]: https://github.com/sopel-irc/sopel/pull/2013
[#2014]: https://github.com/sopel-irc/sopel/pull/2014
[#2015]: https://github.com/sopel-irc/sopel/pull/2015
[#2018]: https://github.com/sopel-irc/sopel/pull/2018
[#2020]: https://github.com/sopel-irc/sopel/pull/2020
[#2023]: https://github.com/sopel-irc/sopel/pull/2023
[#2025]: https://github.com/sopel-irc/sopel/pull/2025
[#2026]: https://github.com/sopel-irc/sopel/pull/2026
[#2027]: https://github.com/sopel-irc/sopel/pull/2027
[#2028]: https://github.com/sopel-irc/sopel/pull/2028
[#2029]: https://github.com/sopel-irc/sopel/pull/2029
[#2033]: https://github.com/sopel-irc/sopel/pull/2033
[#2034]: https://github.com/sopel-irc/sopel/pull/2034
[#2035]: https://github.com/sopel-irc/sopel/pull/2035
[#2037]: https://github.com/sopel-irc/sopel/pull/2037
[#2041]: https://github.com/sopel-irc/sopel/pull/2041
[#2044]: https://github.com/sopel-irc/sopel/pull/2044
[#2046]: https://github.com/sopel-irc/sopel/pull/2046
[#2047]: https://github.com/sopel-irc/sopel/pull/2047
[#2048]: https://github.com/sopel-irc/sopel/pull/2048
[#2049]: https://github.com/sopel-irc/sopel/pull/2049
[#2050]: https://github.com/sopel-irc/sopel/pull/2050
[#2052]: https://github.com/sopel-irc/sopel/pull/2052
[#2053]: https://github.com/sopel-irc/sopel/pull/2053
[#2056]: https://github.com/sopel-irc/sopel/pull/2056
[#2058]: https://github.com/sopel-irc/sopel/pull/2058
[#2059]: https://github.com/sopel-irc/sopel/pull/2059
[#2060]: https://github.com/sopel-irc/sopel/pull/2060
[#2063]: https://github.com/sopel-irc/sopel/pull/2063
[#2064]: https://github.com/sopel-irc/sopel/pull/2064
[#2065]: https://github.com/sopel-irc/sopel/pull/2065
[#2066]: https://github.com/sopel-irc/sopel/pull/2066
[#2067]: https://github.com/sopel-irc/sopel/pull/2067
[#2069]: https://github.com/sopel-irc/sopel/pull/2069
[#2071]: https://github.com/sopel-irc/sopel/pull/2071
[#2072]: https://github.com/sopel-irc/sopel/pull/2072
[#2074]: https://github.com/sopel-irc/sopel/pull/2074
[#2076]: https://github.com/sopel-irc/sopel/pull/2076
[#1683]: https://github.com/sopel-irc/sopel/issues/1683
[pypi-vcrpy]: https://pypi.org/project/vcrpy/
[sopel-github]: https://github.com/sopel-irc/sopel
[sopel-irc]: ircs://irc.libera.chat/sopel
[sopel-twitter]: https://twitter.com/SopelIRC
Changes between 7.0.6 and 7.0.7
===============================
Core changes
------------
* Make sure Sopel continues to install smoothly on all of its supported Python
versions after November 2020 changes in `urllib3` 1.26
* Updated a few spots in tests and documentation to keep our 7.0.x maintenance
branch in tip-top shape
Changes between 7.0.5 and 7.0.6
===============================
Core changes
------------
* Tweak `reddit` plugin's requirements to mitigate install problems on older
versions of Python [[#1919][]]
[#1919]: https://github.com/sopel-irc/sopel/pull/1919
Changes between 7.0.4 and 7.0.5
===============================
Core changes
------------
* Update `ip` plugin's requirements to prevent install problems on older
versions of Python [[#1909][]]
* Also includes a tweak to one of DuckDuckGo's tests in the `search` plugin,
and a backported update to the `ip` plugin's tests.
[#1909]: https://github.com/sopel-irc/sopel/pull/1909
Changes between 7.0.3 and 7.0.4
===============================
Plugin changes
--------------
* Relax DuckDuckGo test in `search` plugin that was causing CI issues
Core changes
------------
* Fix plugin name in bot's internal command-group tracking [[#1863][]]
[#1863]: https://github.com/sopel-irc/sopel/pull/1863
Changes between 7.0.2 and 7.0.3
===============================
Plugin changes
--------------
* Tweak Bing result matching in `search` plugin again [[#1854][]]
Core changes
------------
* Fix URL callbacks missing required attributes [[#1855][]]
[#1854]: https://github.com/sopel-irc/sopel/pull/1854
[#1855]: https://github.com/sopel-irc/sopel/pull/1855
Changes between 7.0.1 and 7.0.2
===============================
Plugin changes
--------------
* Fix version comparison in `find_updates` plugin [[#1832][]]
* Suppress link when `xkcd` plugin is triggered by a URL [[#1848][]]
* Fix `reddit` grammar when post/comment only has 1 point [[#1849][]]
* Handle missing data when `safety` plugin uses VirusTotal [[#1851][]]
* Update `search` plugin for changed Bing SERPs [[#1852][]]
* Also fixes `xkcd` plugin's find-comic-by-keywords functionality
Core changes
------------
* Fixed that per-channel configuration didn't work as documented for some
plugin types [[#1840][]]
* Show how to use channel key (password) in configuration examples [[#1844][]]
* Fixed URL callbacks bypassing user/channel restrictions [[#1845][]]
* Capped `urllib3` (transitive dependency from `requests`) version on Python
3.3 to avoid a recent release breaking things
* Meta: Fixed incorrect links in changelog entry for 7.0.1
API changes
-----------
* Handle 0 seconds properly in `tools.time.seconds_to_human()` [[#1843][]]
[#1832]: https://github.com/sopel-irc/sopel/pull/1832
[#1840]: https://github.com/sopel-irc/sopel/pull/1840
[#1843]: https://github.com/sopel-irc/sopel/pull/1843
[#1844]: https://github.com/sopel-irc/sopel/pull/1844
[#1845]: https://github.com/sopel-irc/sopel/pull/1845
[#1848]: https://github.com/sopel-irc/sopel/pull/1848
[#1849]: https://github.com/sopel-irc/sopel/pull/1849
[#1851]: https://github.com/sopel-irc/sopel/pull/1851
[#1852]: https://github.com/sopel-irc/sopel/pull/1852
Changes between 7.0.0 and 7.0.1
===============================
Sopel 7.0.1 contains small fixes and tweaks for core code, core plugins, and
documentation. As this is a maintenance release, there are no new API features
or deprecations to report—but stay tuned for a few new things in version 7.1.0.
Plugin changes
--------------
* The `reddit` plugin now displays when a redditor is an admin [[#1764][]]
* When triggered by a native media link, `reddit` plugin output will include a
link to the submission page (comments view) [[#1814][]]
* Fixed `reddit` plugin not matching links with encoded characters [[#1827][]]
* `clock` plugin's `.setchanneltz` command now emits an error message if an
unprivileged user attempts to use it [[#1828][]]
* Fixed the `units` plugin's handling of 16 ounces / 1 pound [[#1829][]]
* Fixed loading `remind` database with reminder(s) containing certain IRC
formatting characters [[#1831][]]
Core changes
------------
* Hotfixed a crash that could occur if the connection was lost [[#1820][]]
* Sopel now prints the used config file path at startup [[#1822][]]
[#1764]: https://github.com/sopel-irc/sopel/pull/1764
[#1814]: https://github.com/sopel-irc/sopel/pull/1814
[#1820]: https://github.com/sopel-irc/sopel/pull/1820
[#1822]: https://github.com/sopel-irc/sopel/pull/1822
[#1827]: https://github.com/sopel-irc/sopel/pull/1827
[#1828]: https://github.com/sopel-irc/sopel/pull/1828
[#1829]: https://github.com/sopel-irc/sopel/pull/1829
[#1831]: https://github.com/sopel-irc/sopel/pull/1831
Changes between 6.6.9 and 7.0.0
===============================
Sopel 7.0 contains numerous fixes, tweaks, new features, and internal
improvements. While we maintain no official statistics on such things, it's
probably the biggest release the project has ever seen.
The full, detailed list of changes is below, but you can just read the
[migration guide][sopel-7-migration] if all you care about is the really
important stuff. All breaking changes (including those planned for the *next*
release) are explained there.
Plugin changes
--------------
* The `spellcheck` plugin has been removed to simplify dependencies [[#1675][]]
* An updated version with added features and tweaks, based on `aspell`, is
installable separately [from PyPI][spellcheck-pypi] [[#1164][], [#1545][]]
* See [#1142][] & [#1642][] for background on why we decided to separate
`spellcheck` into a separate package (tl;dr: dependency hell)
* Similarly, the `ipython` plugin is now an external package, eliminating from
Sopel itself a dependency which most users will never need [[#1684][]]
* Find the new `sopel-ipython` package [on PyPI][ipython-pypi]
* The `.choose`/`.choice` command has been moved from `dice` into a standalone
plugin, aptly named `choose` [[#1679][]]
* Moved `.py` into its own plugin, named `py` [[#1710][], [#1711][], [#1712][]]
* In case of issues with our "official" instance, there's now a setting to
configure the address of your own [Oblique][oblique] service
* The `currency` plugin changed data sources to support more currencies, and
can optionally use Fixer.io for even *more* [[#1430][], [#1627][], [#1629][]]
* Fixer.io requires a free API key, which gives plenty of calls per month
(the plugin caches exchange rates for 24 hours)
* Choose any of five pastebin services for `help` output [[#1451][], [#1651][]]
* This is intended mostly for resilience (so one pastebin service going
down, as ptpb did during the 6.6.x life-cycle, won't force a new Sopel
release), but it's also just good to have choices
* Optionally hide IRC server name/address in `help` command listing [[#1459][]]
* New `help` plugin setting, `reply_method` [[#1700][]]
* `wiktionary` now supports many more parts of speech [[#1443][]]
* Definitions can be retrieved for things like proper nouns, prepositional
phrases, and punctuation marks—things that were unsupported in Sopel 6.x
* This means that the `wiktionary` plugin is now somewhat case-sensitive, to
account for common and proper nouns that differ only in capitalization
* `url` will now ignore "private" addresses by default [[#1439][], [#1624][]]
* New config settings for the `url` plugin allow overriding the checks, in
cases where loading previews of e.g. LAN servers is safe
* The default is off, so users don't unwittingly open themselves to attackers
fishing for running HTTP services on the local machine or network
* `url` now correctly ignores invalid URLs (e.g. `http://*\.com`) [[#1788][]]
* Various improvements to the `clock` functions [[#1592][]]
* Improved guessing in `.t`/`.time` command, which no longer falls back all
the way to the bot's default timezone if given an unrecognized argument
* New `.tz` command, to explicitly get time for a timezone name (in case of
conflict between a known nick and a timezone name)
* The `tell` & `remind` plugins' ".db" files have changed names [[#1699][]]
* Both will attempt automatic migration of existing files, if they exist,
and output debugging information if the migration fails
* The `.at` command (in `remind`) understands dates now [[#1590][], [#1736][]]
* Finally, it's possible to set a reminder more than 24 hours ahead without
first converting the future date/time to a duration for use with `.in`!
* A new `tell` plugin setting allows delivering messages privately [[#1694][]]
* The `reddit` plugin now also handles short `redd.it` links, direct links to
comments, inline `u/` and `r/` references, & reddit-hosted image/video links
[[#1503][], [#1720][], [#1722][], [#1734][], [#1760][], [#1773][]]
* Spoilers & NSFW are now separate concepts in the `reddit` plugin [[#1620][]]
* Reddit implemented spoilers as a distinct post flag some time ago. Sopel's
plugin supports independently setting channels as "SFW" or "spoiler-free".
* Rolling `.dice` now officially supports trailing `# comments` [[#1577][]]
* Python version is now included in `.version` command output [[#1462][]]
* The `.version` command's output format is improved [[#1633][]]
* Using the `.reload` command shows the specific file reloaded [[#1762][]]
* The `.seen` command's output now uses relative time [[#1661][]]
* Readability of `.choose` command output is significantly improved [[#1425][]]
* Added `.invite` command [[#1497][]]
* Both Sopel and the inviting user must have privileges in the target channel
* A `.restart` command is added [[#1333][]]
* Usable by admins only, just like `.quit`
* The `.msg` command is now known as `.say` [[#1606][]]
* `.msg` will continue to work for now, likely until being removed in Sopel 8
* The `admin` plugin auto-saves channels when using `.join`/`.part`, and added
`.tmpjoin`/`.tmppart` commands to bypass this behavior [[#1492][]]
* Added command to `.unset` config values in the `admin` plugin [[#1556][]]
* Restored commands in `adminchannel` plugin for managing op/voice [[#1498][]]
* These were removed some time ago, seemingly without reason, by the
project's previous maintainers
* Since there was some desire from users to have them back, we restored them
* Fixed/tweaked hostmask handling in `adminchannel` ban functions [[#1791][]]
* `find` also collects Sopel's own messages now, so users can "correct" the bot
if they wish to be extra cheeky [[#1470][]]
* Fixed that the `url` plugin had to be enabled or some link-handling functions
wouldn't work [[#1510][]]
* Tweaked `.ddg` command output so it's less likely to mangle URLs [[#1713][]]
* `remind` commands now "reply" with error messages [[#1715][]]
* Fixed `etymology` plugin error with empty argument [[#1677][]]
* Fixed an uncaught exception in `instagram` plugin [[#1702][]]
* Handle JSON fetch/parse errors in `find_updates` plugin [[#1779][]]
* Removed nonsensical uses of the `core.verify_ssl` setting [[#1706][]]
* Unused `clock` plugin settings have been removed [[#1696][]]
* Updated MaxMind database handling in `ip` plugin [[#1797][]]
* Reworked `safety` plugin's cache management [[#1753][], [#1802][]]
* General code cleanup and tweaks all around [[#1402][], [#1486][], [#1505][],
[#1569][], [#1573][], [#1578][], [#1579][], [#1581][], [#1592][], [#1606][],
[#1607][], [#1609][], [#1678][], [#1681][], [#1696][], [#1717][], [#1721][],
[#1725][], [#1735][], [#1741][], [#1754][]]
Core changes
------------
* Brought back support for non-SQLite databases by switching to SQLAlchemy
[[#1446][], [#1652][], [#1729][], [#1755][], [#1774][], [#1777][], [#1783][]]
* For details on using non-SQLite databases, see the [README][readme-db] or
[configuration instructions][db-config-docs]
* You will probably need to install additional dependencies if you wish to
use something other than SQLite
* Migrating an existing database from SQLite to your chosen option is
probably easy, but we do not offer instructions for doing so
* Be aware that plugins written for older versions of Sopel might not work
properly with non-SQLite databases
* The `db_filename` config setting (for SQLite) is now interpreted as relative
to the config's `homedir` setting [[#1574][]]
* `homedir` itself has a default value that will be used if not set
* Added separate server & nickname authentication options [[#1513][]]
* See [authentication configuration docs][auth-config-docs]
* Added `commands_on_connect` setting to send a list of commands automatically
when Sopel's IRC connection is successfully established [[#1528][]]
* Log files have become *much* more configurable [[#1678][], [#1714][]]
* Logs are named based on the config name
* Many, many new settings added to customize logging
* The default log format includes timestamp, source package, & level (which
will make logs *much* more useful when reporting bugs)
* Logs now have information about which plugin file was reloaded [[#1762][]]
* This is helpful for owners of Sopel instances with multiple versions of a
plugin available for testing or development purposes
* Sopel's own rate-limiting & flood protection parameters are now configurable,
and can even be turned off entirely if Sopel is behind a bouncer or other IRC
proxy that handles flood protection itself [[#1518][], [#1638][]]
* Added more control over JOIN throttling [[#1751][]]
* Includes a new `throttle_wait` setting instead of a hard-coded time value
* Log timestamp and log line formats are now configurable [[#1512][]]
* See details in [the logging configuration docs][logging-config-docs]
* Log filenames now include the config name, to help keep track of logs from
multiple Sopel instances [[#1547][]]
* Home directory is no longer assumed to be `~/.sopel` on first run [[#1404][]]
* Restarting Sopel via CLI is added [[#1333][]]
* Sopel's CLI is restructured [[#1493][], [#1509][], [#1718][]]
* New subcommands (`start`, `stop`, `restart`, and `configure`) replace many
of the old `--option`s, cleaning up the syntax
* The legacy `--option`s will continue to work for the life of Sopel 7.x, and
will be removed in Sopel 8
* New `--config-dir` common option [[#1598][]]
* Added a new `sopel-config` command for working with config files [[#1507][]]
* Currently supports `list` (existing files), `init` (new config file), and
`get` (config value) actions
* The old `--list` argument to `sopel` is considered deprecated, and will be
removed in Sopel 8
* See detailed usage in your terminal with `sopel-config --help`, or review
[the online CLI docs][docs-cli-config] at our website
* Added a new `sopel-plugins` command for managing plugins [[#1588][]]
* Currently supports `list` (available plugins), `show` (plugin details &
status), `enable` & `disable` (edits config on the user's behalf)
* See detailed usage in your terminal with `sopel-plugins --help`, or review
[the online CLI docs][docs-cli-plugins] at our website
* Sopel now also looks for plugins in `$HOMEDIR/plugins` [[#1747][]]
* This is part of a longer-term plan to reduce confusion over the term
"module", which Sopel has been using in conflicting ways; see [[#1738][]]
* The config file Sopel should use can be specified via the `SOPEL_CONFIG`
environment variable [[#1473][]]
* List values in config can be separated by newlines [[#1628][], [#1690][]]
* Newline-separated values support commas within each value
* Comma-separated value support will end someday, but likely not till Sopel 9
* Find more details in [the `ListAttribute` documentation][docs-listattr]
* Config options can be set/overridden via environment variables [[#1096][]]
* Variable naming format: `SOPEL_SECTION_OPTION`
* Underscores in `SECTION` and `OPTION` names are preserved, e.g.
`SOPEL_CORE_AUTH_PASSWORD`
* Example multi-instance systemd template is now available [[#1059][]]
* Example systemd unit files wait until networking is connected before starting
Sopel [[#1511][]]
* Running Sopel on an unknown OS platform will output a warning encouraging the
user to report any issues (because test coverage on an unrecognized platform
name is likely to be nil) [[#1487][]]
* Cleaned up or refactored a bunch of places [[#1424][], [#1429][], [#1456][],
[#1458][], [#1472][], [#1479][], [#1510][], [#1522][], [#1527][], [#1542][],
[#1557][], [#1561][], [#1567][], [#1579][], [#1580][], [#1583][], [#1597][],
[#1610][], [#1635][], [#1685][], [#1697][], [#1708][], [#1716][], [#1723][],
[#1724][], [#1728][], [#1730][], [#1731][], [#1732][], [#1735][], [#1739][],
[#1740][], [#1741][], [#1742][], [#1743][], [#1754][], [#1759][], [#1787][]]
* Sopel 7 will emit warnings when run under Python 2, as Python 2.7 support
officially ended on January 1, 2020 [[#1488][], [#1795][], [#1800][]]
* Sopel's warnings are set to become more dire around the time when Python's
maintainers plan to release the final version of 2.7
* While Sopel 7 is intended to remain compatible with Python 2, future
compatibility is not guaranteed, and users should plan for Sopel 8 to
officially drop Python 2 support (see [upgrade notes][sopel-7-migration])
* Added support for IRCv3 `echo-message` capability, which Sopel will now
request upon connecting to an IRC server [[#1470][], [#1672][], [#1674][]]
* Added support for disabling commands (or entire plugins) on a per-channel
basis [[#1235][]]
* See how it works: [Per-channel configuration][per-channel-conf]
* Fixed tracking user `away` state [[#1663][], [#1664][], [#1666][], [#1703][]]
* User information is now periodically updated [[#1664][]]
* Fixed a case in which MODE tracking could break [[#1737][]]
* Handle non-standard `+y`/`+Y` OPER modes [[#1671][]]
* A new `OPER` constant in `sopel.module` now exists for these channel modes,
which (at least on InspIRCd) use the privilege prefix `!`
* This is a stopgap for one specific case; we are working on further changes
to support dynamic parsing of privilege modes/prefixes at connect time
* Stopped sending TOPIC command on JOIN [[#1749][]]
* IRC servers should send the topic on join without being asked, per spec
* Greatly improved the warning printed when a deprecated function is used,
adding detail and removing unnecessary traceback lines [[#1568][], [#1613][]]
* Typical length of output for each deprecated function call reduced from
roughly 15 lines to 3 (warning, file/line, and offending code snippet)
* Added optional `@deprecated` decorator arguments:
* `reason`: why this item was deprecated
* `version`: the version in which the deprecation happened
* `removed_in`: the version in which the deprecated item will be removed
* The end-of-life warning for users on Python 2.x is now date-aware [[#1756][]]
* Made sure ignored users cannot trigger URL handlers [[#1806][]]
* Tightened up some more dependency version specifiers [[#1807][]]
API changes
-----------
* [API documentation][api-docs] has been almost entirely overhauled [[#1563][],
[#1566][], [#1646][], [#1668][], [#1669][], [#1680][], [#1719][], [#1727][],
[#1735][], [#1750][], [#1766][], [#1770][], [#1771][], [#1772][], [#1775][],
[#1776][], [#1778][], [#1782][], [#1813][]]
* Nearly every file, both for the public API and Sopel's internals, was
reviewed in its entirety to make these improvements globally:
* More consistent style
* Better use of Sphinx features (e.g. parameter definitions, return value
notes, & version annotations)
* General cleanup and copy-editing
* Add more detail and examples to help new bot users and plugin authors
* Remove or correct outdated information left over from previous versions
* Most of Sopel's submodules now define `__all__`, limiting namespace pollution
from using `*` in imports [[#1582][], [#1727][]]
* Plugins can register themselves via `setuptools` entry points [[#1585][]]
* This feature is an evolution of the previous mechanism to install plugins
via PyPI packages, which required a specific directory structure and
package name format (`sopel_modules.plugin_name`)
* See [the entry point plugin documentation][entry-point-plugin] for more
* Logging has been reworked [[#1678][]]
* The `sopel.logger.get_logger()` function is deprecated in favor of a new
`sopel.tools.get_logger()` utility with plugin-specific behavior
* `sopel.logger.get_logger()` will begin emitting deprecation warnings in
version 8.0, and will be removed in 9.0
* Testing tools have been overhauled [[#1731][], [#1732][], [#1781][]]
* The old "Mock" classes in `sopel.test_tools` are now deprecated:
* `MockConfig`
* `MockSopel`
* `MockSopelWrapper`
* New pytest fixtures make the real objects usable in tests directly
* The bot keeps track of running triggered threads, so tests can be sure that
processing has finished before evaluating results
* Sopel also now exports a `pytest` plugin, for convenience
* `module.event()` decorator no longer requires a rule [[#1693][], [#1709][]]
* Since 99% (unscientific guesstimate) of event decorators were paired with
`@module.rule('.*')`, that's now implied if no rule decorator is present
* Added `sopel.tools.web` (replaces `sopel.web`) [[#1616][], [#1670][]]
* Both old and new import locations will work until Sopel 7 end-of-life
* The `sopel.web` package will be removed completely in Sopel 8
* Functions marked as deprecated in the old location (e.g. `web.get()`) do
*not* carry forward to the new package namespace; they remain deprecated
* Added `tools.web.unquote()`, the reverse of `tools.web.quote()` [[#1681][]]