Commit Graph

386 Commits (6a20b99859846f5021172feb5ccf846546ec3604)

Author SHA1 Message Date
Dragory 00fe240eb0
Expand multi-line .ini value support
The following options now also support multi-line values:
- responseMessage
- closeMessage
- botMentionResponse
- greetingMessage
- accountAgeDeniedMessage
- timeOnServerDeniedMessage
2020-01-19 21:25:10 +02:00
Dragory 667b552bf5 Fix error when supplying all config values from env variables
If there was no config file and all config values were loaded from env
variables, the userConfig object was never assigned a value and would
throw an error when loading env variables.
2019-12-05 21:50:02 +02:00
Dragory 4920425ad0 Mention logChannelId option in log channel errors 2019-12-05 21:49:24 +02:00
Dragory 69352eb756 Remove old logChannelId fallback, add additional verification that the log channel is a text channel 2019-12-05 21:04:45 +02:00
Dragory d625e527d6 Fix crash in update checker if package.json's repository value is set to a repository without releases 2019-12-05 20:24:39 +02:00
Dragory 7e567a3267 Handle boolean values in config.ini properly 2019-12-03 03:00:26 +02:00
Dragory 20b46811c0 Slight wording changes in README. Use Modmail instead of ModMail consistently. 2019-12-03 02:47:46 +02:00
Dragory 8dd6513ca3 Add support for loading config values from environment variables 2019-12-03 02:40:50 +02:00
Dragory 1007dc0dd1 Add support for loading config values from environment variables. Fix nested/object values in config.ini. 2019-12-03 02:27:55 +02:00
Dragory 518bf93f6f Fix incompatibility with Node.js 10 versions prior to 10.9.0 2019-12-03 02:06:44 +02:00
Dragory 6635fe1414 Make sure numeric options are numbers. Convert empty strings from config.ini to null. Some loading message tweaks. 2019-12-03 02:00:00 +02:00
Dragory 89e7d6373b Switch from TOML to INI. New documentation. Add start.bat file for Windows. 2019-12-03 01:51:11 +02:00
Dragory 686c36dda4 Add support for TOML config files. Use TOML config files by default. 2019-12-02 19:01:36 +02:00
SnowyLuma a2f34113d4 Don't ignore other bots chatting in threads 2019-09-29 03:59:09 +02:00
Dragory 2ea858daac Move plugin loading to its own file. Define plugin API more explicitly. 2019-09-18 02:15:22 +03:00
Dragory 0f61966d4e Add support for adding attachment storage types in plugins 2019-09-18 01:52:16 +03:00
Dragory 5244cce31c Fix local attachments when temp dir and bot dir are on different drives 2019-09-18 01:34:17 +03:00
Dragory 8f9709b34b Make syncPermissionsOnMove option true by default 2019-08-13 20:37:00 +03:00
Dragory 5085cf363a Call plugin functions with an object instead
Previously, plugin functions were called with 4 arguments.
These 4 arguments are now part of the passed object instead, making the
plugin system much more scalable in the future.
2019-08-13 20:34:46 +03:00
Dragory 01e63f27b6 Re-apply bot status every hour 2019-08-13 19:59:33 +03:00
Dragory fcd48d6420 Wait for main and inbox guilds to become available before initializing the bot 2019-08-13 19:58:05 +03:00
Dragory 158db3c070 Fix replies without text that include attachments 2019-06-16 22:37:05 +03:00
Dragory 38c7bd83ff Switch to knub-command-manager instead of Eris's command client. Update sqlite3 for Node.js 12 support. 2019-06-16 22:27:30 +03:00
Dragory 099e01c25a Update Node.js version check at startup to require Node.js 10 2019-06-09 21:02:34 +03:00
Dragory 86529ae50c Don't hardcode repo URL for update check user agent 2019-06-09 20:32:52 +03:00
Dragory 3cf31f37d9 Add pagination to !logs 2019-06-09 20:25:47 +03:00
Dragory a60515bcc7 Fix !block/unblock time arg without explicit user id 2019-06-09 20:25:21 +03:00
Dragory 1259669c9d Add support for timed blocks. Add !is_blocked. 2019-06-09 20:04:40 +03:00
Dragory 4bfd247be3 Add support for command aliases 2019-06-09 19:31:16 +03:00
Dragory 7a57e3eb45 Add support for multiple mentionRole values 2019-06-09 19:24:00 +03:00
Dragory 2d5bf76209 Add support for snippet arguments 2019-06-09 19:17:32 +03:00
Dragory 373aef55cf Add basic support for plugins 2019-06-09 17:53:49 +03:00
Dragory b9133da4da Add update notifications 2019-06-09 17:31:17 +03:00
Dragory eb2f109301 Add rolesInThreadHeader config option 2019-06-09 16:04:17 +03:00
Dragory 18f3da1247 Add guildGreetings config option 2019-06-09 15:56:04 +03:00
Dragory b5fe1de87b Ignore errors from unknown message types 2019-06-05 23:11:08 +03:00
Dragory ae3f3920e3 Ignore account age/time on server requirements when using !newthread 2019-04-15 19:26:14 +03:00
Dragory 22e03d2335 Rename requiredJoinedAt -> requiredTimeOnServer, add support for multiple main guilds for that setting 2019-04-15 19:06:59 +03:00
santiago f2808c0b04 Add requirement for joinedAt 2019-04-15 10:43:22 -03:00
Dragory 2a20d9fdaa Escape markdown in user nickname and some other places 2019-03-28 05:03:47 +02:00
Dragory 3d077cb252 Add current voice channel to thread header 2019-03-28 04:57:21 +02:00
Dragory 073f3a87ea Add categoryAutomation config option and make newThreadCategoryId a shortcut for the newThread sub-option. Add support for per-guild categories via categoryAutomation. 2019-03-28 04:54:12 +02:00
Dragory ddc3f6425a Clean-up 2019-03-28 04:29:50 +02:00
Dragory 3cc566e6b0 Re-fetch member info from the API if we can't find a user on a main guild 2019-03-28 04:29:40 +02:00
Dragory a470b72016 Add attachmentStorage option 2019-03-06 23:31:24 +02:00
Miikka 591d6251ce
Merge pull request #225 from reboxer/master
Allow users to be mentioned in botMentionResponse
2019-03-06 21:39:37 +02:00
Dragory 688ab7ceea Add support for scheduled !suspend 2019-03-06 21:37:36 +02:00
Dragory bee147c19d Allow !loglink in suspended threads 2019-03-06 21:36:17 +02:00
Dragory 188f7543ee Allow silent scheduled closes. Make close time format stricter (no whitespace). 2019-03-06 21:15:09 +02:00
Dragory cd3da4c4ec Add syncPermissionsOnMove config option 2019-03-06 20:50:24 +02:00
Dragory 5e1a1e7e15 Add 'silent' option to !close when closeMessage is specified 2019-02-23 23:32:18 +02:00
Dragory 86bc6fd809 Only delete the reply command if the bot was able to send the reply 2019-02-23 22:55:26 +02:00
santiago 508b78fce2 Allow users to be mentioned in botMentionResponse 2019-02-23 11:33:22 -03:00
Dragory ee51e35f6f Fix potential error with webhook messages 2019-01-11 18:29:48 +02:00
Dragory 21d2a7453c Add allowUserClose option. Fixes #69 2018-09-20 23:31:14 +03:00
Dragory 2f1b51d97a Add support for sending anonymous snippets. Add snippetPrefixAnon option. Fixes #82 2018-09-20 22:54:47 +03:00
Dragory 1ec0a811d9 Support role and user IDs in inboxServerPermission. Allow specifying multiple values for inboxServerPermission. 2018-09-20 22:27:59 +03:00
Dragory a8822ea002 Merge branch 'config-fix' of https://github.com/Akhawais/modmailbot into Akhawais-config-fix 2018-09-20 22:08:50 +03:00
Dragory d07384a01e Add botMentionResponse option. Fixes #143 2018-09-20 22:07:38 +03:00
Dragory 68af488663 Add mentionUserInThreadHeader option. Fixes #152 2018-09-20 22:03:51 +03:00
Dragory 2f04ed8359 Fix pingOnBotMention on same server setups. Fixes #134 2018-09-20 21:57:54 +03:00
Dylan Akhawais 5a760b5e50 Moving the 'getAllUsers' option into the correct parameter object 2018-08-29 02:30:12 +01:00
Dragory 2cecbc3e46 Add support for a .js config file 2018-08-08 01:32:22 +03:00
Dragory 55367665e8 Update mime node-mime to 2.3.1 2018-08-08 01:10:38 +03:00
Dragory b7673b7544 Add smallAttachmentLimit config option to control the size limit of relaySmallAttachmentsAsAttachments 2018-08-08 00:59:02 +03:00
Dragory 7e7bd03798 Fix crash if the close message failed to send when closing a thread 2018-08-08 00:55:03 +03:00
Dragory ff977b3eea Gracefully handle web server errors 2018-08-08 00:54:01 +03:00
Dragory 6b8a409ff4 Don't alert for main server pings if the pinger is a bot 2018-08-01 00:40:12 +03:00
Dragory c7c0ee4e9a Change requiredAccountAge to use hours instead of days 2018-07-27 20:35:37 +03:00
Dragory 1aa4abd62e Rename account age options 2018-07-27 19:48:45 +03:00
Jonas Pardon 9c1a5863f5 Add option for minimum account age for contacting modmail
Saw this on the to-do list and decided to give it a shot. Tested and works without issues for me. I advise testing yourself before merging, there's always a chance I missed something since your code is quite extended to work through.
2018-07-10 11:59:29 +02:00
Jonas Pardon 6f327b7456 Added an optional close message
You can assign a value to closeMessage to make the bot DM people when their thread gets closed.
2018-07-05 18:34:12 +02:00
Dragory 445659d592 Fix greetings not being sent after 2.9.0
Greetings broke when multi-server support was added.
This commit fixes that.
2018-05-14 19:49:15 +03:00
Dragory 54e9fbd597 Chunk long messages so they don't fail to send 2018-05-03 20:33:19 +03:00
Dragory 1d2f3dd4d8 Fix crash when the auto-response cannot be sent. Add pingOnBotMention option for controlling whether the staff get pinged for bot mentions. 2018-05-03 20:26:12 +03:00
Dragory cd96c70f1c Switch config parser to JSON5. Accept multiple config file names. 2018-05-03 19:55:21 +03:00
Miikka 685ccdd226
Always show multi-server header when using multiple servers
Previously, if the user was on only one server, the server name would not be shown in the thread header.
2018-05-03 19:37:50 +03:00
Miikka 777ea2dd2c
Fix crash when user edits a DM after the thread is closed 2018-05-03 14:22:38 +03:00
Miikka 82a89b6e86
modules.move: slightly prioritize categories that start with the search string 2018-04-25 02:25:49 +03:00
Miikka d6793d5c12
modules.move: fix !move ignoring the last letter of the category name 2018-04-25 02:21:24 +03:00
Dragory e5588d7c83 Use minutes as the default unit for timed close
Before, doing !close 30 would close the thread in 30 seconds. Now it
will be closed in 30 minutes.
2018-04-21 16:44:03 +03:00
Dragory a839372cfe You can now use !close c as an alias for !close cancel 2018-04-21 16:42:35 +03:00
Dragory 5e1b5112a2 Add !alert
Using !alert in a modmail thread will ping you the next time the thread
gets a new reply. Use !alert cancel to cancel.
2018-04-21 16:39:38 +03:00
Dragory 3911d92edc Display source guild in bot mention notifications
Only when using multiple main guilds.
2018-04-21 15:54:41 +03:00
Dragory 319f6571bc Add !id
The !id command returns the user ID of the current thread. Useful for
getting the user ID on mobile.
2018-04-21 15:41:03 +03:00
Dragory e5b29a235e Add multi-server support and more thread header information
Fixes #63. Multi-server support allows you to set an array of ids in
mainGuildId. If there are more than 1 main guild, the thread header will
display nickname and join date for each main guild the user is in.

Thread header information now also includes how long it's been since the
user joined the guild(s).

The commit also includes some minor code cleanup.
2018-04-21 15:38:21 +03:00
Dragory 1fc32f71d0 Fix #67: errors from privacy settings are now ignored with greetings 2018-04-21 14:31:58 +03:00
Dragory 4305609f0b Add !newthread 2018-04-08 02:56:30 +03:00
Dragory 9c322a5af3 Add !version command 2018-03-13 07:59:27 +02:00
Dragory ab3d70008a Move more code from main.js to individual module files. Rename plugins -> modules. Remove some obsolete comments. 2018-03-13 07:45:31 +02:00
Dragory 5717bf83fd Make !close time parser stricter and allow 'd' for days. Format close time better in the confirmation message. Add additional start-up info for missing dependencies. 2018-03-13 07:27:59 +02:00
Dragory 434dab59ee Fix some inconsistencies between DB drivers, also fixing scheduled closes on MySQL/MariaDB (again) 2018-03-13 06:23:32 +02:00
Dragory 07c0336f72 Also add that fix to the third place where it's needed 2018-03-11 23:20:59 +02:00
Dragory 2251cabe86 Additional fix for scheduling in MySQL/MariaDB 2018-03-11 23:19:45 +02:00
Dragory 119faf1d37 Commands used in threads are now saved again. Refactor some of the code into plugins. 2018-03-11 23:17:14 +02:00
Dragory 38bb553588 Scheduling fix for MySQL/MariaDB version 3000 2018-03-11 22:48:53 +02:00
Dragory 91bb245b59 Don't start scheduled close loop until after connecting to Discord 2018-03-11 22:45:43 +02:00
Dragory 0b677d338e Actually fix scheduled closing on MySQL/MariaDB 2018-03-11 22:42:40 +02:00
Dragory 40e420a40d Fix scheduled closing on MySQL/MariaDB 2018-03-11 22:36:52 +02:00
Dragory b8a5021dd5 Add thread suspending 2018-03-11 22:27:52 +02:00
Dragory dc44bdc103 Remove duplicate definition of threads.findById 2018-03-11 22:15:29 +02:00
Dragory 32260fd22c Auto-close threads if their inbox server channel is deleted 2018-03-11 22:15:16 +02:00
Dragory dcd9d94734 Fix incorrect mentionRole default 2018-03-11 22:08:59 +02:00
Dragory 6767cd91f7 Change option in #59 to mentionRole, and extend functionality
The option now defaults to "here", and also accepts "everyone" as a value.
Can be set to null to disable these mentions entirely.
2018-03-11 21:55:47 +02:00
Dragory 4089e836d4 Merge branch 'master' of https://github.com/HaydenMeloche/modmailbot into pull59-master 2018-03-11 21:42:17 +02:00
Dragory eea540b0fb Use moment.utc() over moment() since we're currently always dealing with UTC times 2018-03-11 21:34:41 +02:00
Dragory 751b18a12d Add scheduled thread closing
A thread can be scheduled to be closed by adding a time parameter to
the !close command. For example, !close 2m would automatically close
the thread in 2 minutes. The actual scheduling is implemented with a
loop that runs every 2 seconds, checking for threads that should be
closed.
2018-03-11 21:32:14 +02:00
HaydenMeloche 92508c7e3f Added user configurable mentions 2018-03-06 18:40:38 -05:00
Dragory 3f99cbd948 Fix merge conflicts 2018-02-24 23:16:28 +02:00
Dragory b2a102f82a A link to the current thread is no longer posted at the beginning of the thread 2018-02-24 13:14:40 +02:00
Dragory f2bfb7d8c9 Merge branch 'experimental' of github.com:Dragory/modmailbot into experimental 2018-02-24 13:03:02 +02:00
Dragory 5ab65a701e Save username + blocked by id with !block 2018-02-24 13:02:54 +02:00
Dragory 3e2954f4e3 legacyMigrator: set blocked_by in migrated blocks to null 2018-02-24 12:58:20 +02:00
Dragory c865eb9d56 legacyMigrator: don't consider log migration if the logs folder is empty 2018-02-24 12:46:02 +02:00
Miikka bd33606384
Fix accidental message checking not being case-insensitive 2018-02-20 12:57:34 +02:00
Dragory 1fa4975e18 Some extra checks for special messageUpdate and messageDelete cases 2018-02-19 02:03:53 +02:00
Dragory 48bbd8cfe1 Fix bug when updating thread messages 2018-02-19 00:55:01 +02:00
Dragory c2a7ae6fa3 legacyMigrator: ahem, one more fix 2018-02-19 00:52:47 +02:00
Dragory 8b4f33f199 legacyMigrator: one more fix for that 2018-02-19 00:50:55 +02:00
Dragory 8a1b8802b3 legacyMigrator: possible fix for last commit 2018-02-19 00:49:44 +02:00
Dragory a76a675f4c legacyMigrator: fix open legacy threads having no message logs 2018-02-19 00:46:15 +02:00
Dragory 87a2c885f8 Add !loglink command 2018-02-19 00:45:56 +02:00
Dragory b9678d08dd Add !move command 2018-02-19 00:23:29 +02:00
Dragory adce3e0cbb Fix missing here ping on new threads. Add threadTimestamps option to revert removal of thread timestamps. 2018-02-18 23:29:24 +02:00
Dragory 92ac21aa33 Fix ignoreAccidentalMessages not working. Fix another weird error with message edits. 2018-02-18 22:52:37 +02:00
Dragory 0a9f26eaff Fix crash with message edits between bot restarts 2018-02-18 22:30:10 +02:00
Dragory e0bd96e959 Logs are posted in the log channel again 2018-02-18 21:21:03 +02:00
Dragory ce6c0da0e2 Fix sorting in !logs 2018-02-18 21:09:52 +02:00
Dragory 6233e53fe4 Fix incorrect permission check 2018-02-18 21:07:26 +02:00
Dragory 2bb4aec249 legacyMigrator: fix duplicate blocked users sometimes breaking migration (race condition) 2018-02-18 21:05:38 +02:00
Dragory f1af3d7314 legacyMigrator: add a progress indicator for log migrations 2018-02-18 20:35:07 +02:00
Dragory a668818421 legacyMigrator: hopefully fix timeout when there are lots of log files to migrate 2018-02-18 20:22:06 +02:00
Dragory 8a77bf1849 Disable small attachment relaying by default, add option for it 2018-02-18 20:06:24 +02:00
Dragory 43d80f5912 Clarify legacy data migration instructions 2018-02-18 20:06:04 +02:00
Dragory ce8624e130 Show logs in reverse order again 2018-02-18 19:43:32 +02:00
Dragory 32c22f4d46 Relay small attachments as attachments. Auto-close threads if the channel no longer exists when receiving a reply. 2018-02-14 08:53:48 +02:00
Dragory ad7aa66c99 Continue rewrite. Modularize greeting, snippet, and web server functionality. 2018-02-11 21:54:30 +02:00
judge2020 26c468d5fb
Add error handling for getDMChannel 2018-01-22 17:34:12 -05:00
judge2020 c306479d8a
Remove unnecessary comment 2018-01-22 17:18:15 -05:00
judge2020 036885144e
Impliment typing proxy 2018-01-22 17:17:24 -05:00
Dragory bb6d8e5dbf Refactor large parts of the bot 2018-01-01 02:16:05 +02:00
Dragory 58f35c87da Start work on moving data to an SQLite database. Add a migrator for legacy data. 2017-12-24 22:04:08 +02:00
Miikka Virtanen b2d9c93f43 Add newThreadCategoryId option 2017-09-22 22:18:15 +03:00
Miikka Virtanen ccb6f7345b Fix addidental error when a thread was not returned but no errors were thrown 2017-09-20 23:06:19 +03:00
Miikka Virtanen 21b5400576 Don't display full stack traces for network errors
They pointed to Eris internals anyway, and are pretty unreadable.
2017-09-20 09:46:11 +03:00
Miikka Virtanen 8426e7b170 fix: don't continue forwarding a DM if the thread could not be created 2017-09-20 09:41:54 +03:00
Miikka Virtanen ebb4ad23d7 Remove cruft left behind by the recent refactoring 2017-09-19 21:33:17 +03:00
Miikka Virtanen 893bfb091e Set greeting defaults to null 2017-09-19 21:32:48 +03:00
Miikka Virtanen b934f8eb25 Code refactoring and clean-up 2017-09-19 20:23:55 +03:00
Miikka Virtanen ddff708ff5 Add 'logChannelId' config option 2017-09-19 17:38:37 +03:00
Miikka Virtanen d0bad2d6b3 Hotfix #2 2017-08-03 22:03:39 +03:00
Miikka Virtanen c330caf249 Hotfix 2017-08-03 22:00:34 +03:00
Miikka Virtanen 4963ba6a39 Fix user nicknames. Don't require manageRoles permission by default anymore (moved to config). 2017-08-03 21:50:41 +03:00
Miikka Virtanen 3b33cde517 Possible fix for 'NOT ON SERVER' 2017-08-03 21:32:16 +03:00
Miikka Virtanen 094f490357 Add !edit_snippet for editing snippets. Add !snippets to list all available snippets. 2017-07-24 03:54:03 +03:00
Miikka Virtanen 779655d3df snippets: when showing snippet info, make the command more visible 2017-07-24 03:30:47 +03:00
Miikka Virtanen c121754800 Add snippets 2017-07-24 03:27:21 +03:00
Miikka Virtanen d4aa7d5fe4 Make edit notif prefixes monospace 2017-07-24 02:44:15 +03:00
Miikka Virtanen f22330338b greeting: send an empty string as message content for falsy values (such as null) instead 2017-07-24 02:42:26 +03:00
Miikka Virtanen 77b4ed856d Transliterate non-ascii names for channel names properly 2017-07-24 02:41:31 +03:00
Miikka Virtanen 1dc21880e2 Clarify some code comments 2017-07-24 02:23:34 +03:00
Miikka Virtanen 3abb376397 Make commands case-insensitive 2017-07-24 02:13:04 +03:00
Miikka Virtanen 6a9e55ade0 Make edit notification prefixes the same length
From "Before" and "After" to "B" and "A" respectively.
Makes it easier to compare small edits.
2017-07-24 02:09:39 +03:00
Miikka Virtanen 32fa668770 Clarify the name of the exported function from greeting 2017-07-24 02:09:06 +03:00
Miikka Virtanen 887facf6a4 Even more ignored words! 2017-05-20 19:45:22 +03:00
Miikka Virtanen 75d721cca0 More ignored words! 2017-05-20 19:44:09 +03:00
Miikka Virtanen 4eec9b07a6 More ignored words... 2017-05-19 15:34:04 +03:00
Miikka Virtanen 7948f12761 More ignored words for new threads 2017-05-19 15:27:28 +03:00
Miikka Virtanen 6b26c1cb5c Sort logs in descending order 2017-05-18 05:52:21 +03:00
Miikka Virtanen e258bf8432 Add config option ignoreAccidentalThreads. Using this option, messages that start with 'ok', 'thanks', etc. will be ignored, as they probably shouldn't start a new thread. 2017-05-18 05:47:45 +03:00
Miikka Virtanen ad3417c827 Add useNicknames config option to use mod nicknames in replies. Post log lists in chunks to avoid hitting the message length limit. 2017-05-18 05:28:11 +03:00
Miikka Virtanen ab7c1e8611 Add attachment links to received messages only after the attachments have been saved. Don't show edits that result in identical messages. Post new thread notifications in the thread in question, not the main channel. Remove ping from close messages. 2017-05-18 05:20:19 +03:00
ahalekelly 71a7e55fd1 Made alwaysReply configurable 2017-05-01 09:14:28 +00:00
ahalekelly cca19ec38e Treat every message as a reply 2017-05-01 07:56:49 +00:00
Miikka Virtanen 7320f6bf9c Handle it gracefully when we can't get guild member info. Indicate if this was due to the member not existing on the guild or because the endpoint didn't give us enough data. 2017-02-15 01:26:17 +02:00
Miikka Virtanen e7ed0e5a21 Add some debug stuff 2017-02-15 01:20:56 +02:00
Miikka Virtanen 3bdd0384f4 Don't you love bugs that only show up in prod? 2017-02-15 01:19:08 +02:00
Miikka Virtanen 1a44065b61 Handle error when guild member doesn't have a user 2017-02-15 01:14:26 +02:00
Miikka Virtanen 2281d01d8c Possibly proper fix 2017-02-15 01:10:44 +02:00
Miikka Virtanen 1f235bb806 Fix2 2017-02-15 01:04:57 +02:00
Miikka Virtanen 087fd85447 Fix 2017-02-15 01:02:45 +02:00
Miikka Virtanen c671ab9273 Add more info at the start of modmail threads. Change greetingGuildId to a more universal mainGuildId. Start using semi-proper version numbers. 2017-02-15 00:57:53 +02:00
Miikka Virtanen 70601f1d00 Show mod username for anonymous replies in logs 2017-02-10 07:39:17 +02:00
Miikka Virtanen 513439746f Add new user greetings 2017-02-10 07:04:23 +02:00
Miikka Virtanen 6a13724c6a Major refactor about done 2017-02-10 06:36:47 +02:00
Miikka Virtanen 6d33e7adb4 Start huge refactor 2017-02-10 04:56:36 +02:00