[somebot] DialogManagedLVAFeedback.
authorSomeone <someone@somenet.org>
Wed, 8 Dec 2021 18:38:38 +0000 (19:38 +0100)
committerSomeone <someone@somenet.org>
Wed, 8 Dec 2021 18:38:38 +0000 (19:38 +0100)
modules/DialogManagedLVAFeedback.py [new file with mode: 0644]

diff --git a/modules/DialogManagedLVAFeedback.py b/modules/DialogManagedLVAFeedback.py
new file mode 100644 (file)
index 0000000..d9c1b22
--- /dev/null
@@ -0,0 +1,155 @@
+# Mattermost Bot module.
+#  Copyright (c) 2016-2021 by Someone <someone@somenet.org> (aka. Jan Vales <jan@jvales.net>)
+#  published under MIT-License
+
+from inspect import cleandoc
+import csv
+import os
+
+
+from AbstractCommand import *
+class DialogManagedLVAFeedback(AbstractCommand):
+    TRIGGER = "lva-feedback"
+    CONFIG = {"display_name": "somebot-command", "auto_complete": False,
+              "auto_complete_hint": "",
+             }
+    USEINFO = CONFIG["auto_complete_desc"] = CONFIG["description"] = "preview-spams channel and asks for feedback. spam manuall!. [BOT_ADMIN]"
+
+
+    def __init__(self, team_id, datadir):
+        super().__init__(team_id)
+
+        self.datadir = datadir
+        self.channels = dict()
+
+        with open(self.datadir+'channels.csv', newline='') as csvfile:
+            self.channels = {row[0]:row for row in csv.reader(csvfile, delimiter=',', quotechar='"')}
+
+
+    def on_POST(self, request, data):
+        self._require_bot_admin(data) # will throw an exception if not. (Dont try-except: Its handled up the stack.)
+
+        msg = cleandoc("""
+            ## :pencil:``COVID course feedback 2.0!``:rocket:
+            The next term is going to be another distance-learning :dl: one.
+            We want your feedback in order to find out which courses need to be improved asap to achieve the excellence we are accustomed to, or better.
+            The feedback will be aggregated, anonymised and discussed with the deans of study affairs and possibly with the vice rector for teaching matter and/or the in-house lawyers.
+
+            #### :point_right: This Feedback form will run up until 2021-02-07 23:59 :point_left:
+
+            What we want to know:
+            + Feedback for this course.
+            + How did you like the modalities of this course? (Would you want it to be applied to others?)
+            + This course's modalities - describe them in a few words. (Also consider updating the info in VoWi - its a work resource for us and we use it to represent you)
+            + Feedback about this survey for :fsinf:. (This will not be shared outside of fsinf)
+
+            :information_source: *We are your legaly appointed representatives - we will never forward any personal info about who wrote what without explicit permission. But please dont make us read a list of profanities.* :)
+            """)
+
+        att = [{
+            "actions": [{"name": ":pencil: Give/edit your feedback", "integration": {"url": self.URL+"/interactive"}}]
+            }]
+
+        print(self.URL)
+        request.cmd_respond_text_chan(msg, {"attachments":att})
+
+
+    def on_POST_interactive(self, request, data):
+        #import pprint
+        #print("on_POST_interactive")
+        #pprint.pprint(data)
+
+#        request.respond(200, {"ephemeral_text": "## ``The submission period ended. We are now evaluating the responses!`` :)"})
+
+        callback_id = "res-"+data["team_id"]+"-"+data["channel_id"]+"-"+data["user_id"]
+
+        feedback_course = self._response_load(self.datadir+callback_id, "-feedback_course.txt")
+        feedback_modus = self._response_load(self.datadir+callback_id, "-feedback_modus.txt")
+        feedback_modus_like = self._response_load(self.datadir+callback_id, "-feedback_modus_like.txt", "0")
+        feedback_fsinf = self._response_load(self.datadir+callback_id, "-feedback_fsinf.txt")
+
+        dialog = {
+            "callback_id": callback_id,
+            "title": "COVID Course feedback 2.0",
+            "submit_label":"Submit",
+            "elements":[{
+                "display_name": "Your Comment/Feedback about the course (Max. 3000 characters)",
+                "placeholder": "Type here. Max. 3000 characters.",
+                "name": "feedback_course",
+                "type": "textarea",
+                "help_text": "We will aggregate and forward your feedback to the deans of study affairs, the vice rector for teaching and possibly others that are deemed able to fix something. You can edit/blank it later at any time.",
+                "optional": True,
+                "default": feedback_course
+            },{
+                "display_name": "Describe the modalities in a few words (Max. 3000 characters)",
+                "placeholder": "Type here. Max. 3000 characters.",
+                "name": "feedback_modus",
+                "type": "textarea",
+                "help_text": "You can edit/blank it later at any time.",
+                "optional": True,
+                "default": feedback_modus
+            },{
+                "display_name": "How did you like the modalities of this course? (Do you want it to be applied to others?)",
+                "placeholder": "Type here. Max. 3000 characters.",
+                "name": "feedback_modus_like",
+                "type": "radio",
+                "options": [
+                    {"text": "I loved it", "value": "2" },
+                    {"text": "I liked it", "value": "1" },
+                    {"text": "I'm indifferent/Don't want to answer (default)", "value": "0" },
+                    {"text": "I disliked it", "value": "-1" },
+                    {"text": "I hated it", "value": "-2" },
+                ],
+                "help_text": "You can edit it later at any time.",
+                "optional": True,
+                "default": feedback_modus_like
+            },{
+                "display_name": "Feedback (about this survey) for FSInf (Max. 3000 characters)",
+                "placeholder": "Type here. Max. 3000 characters.",
+                "name": "feedback_fsinf",
+                "type": "textarea",
+                "help_text": "We will not forward this text to anyone. You can edit/blank it later at any time.",
+                "optional": True,
+                "default": feedback_fsinf
+            }]
+        }
+
+        request.respond(200, {})
+        self.bot.api.open_dialog(data["trigger_id"], self.URL+"/dialog", dialog)
+
+
+    def on_POST_dialog(self, request, data):
+        #import pprint
+        #print("on_POST_dialog")
+        #pprint.pprint(data)
+
+        c = self.bot.api.get_channel(data["channel_id"])
+
+        self._response_store(self.datadir+data["callback_id"], "-feedback_course.txt", data["submission"]["feedback_course"], c["name"])
+        self._response_store(self.datadir+data["callback_id"], "-feedback_modus.txt", data["submission"]["feedback_modus"], c["name"])
+        self._response_store(self.datadir+data["callback_id"], "-feedback_modus_like.txt", data["submission"]["feedback_modus_like"], c["name"])
+        self._response_store(self.datadir+data["callback_id"], "-feedback_fsinf.txt", data["submission"]["feedback_fsinf"], c["name"])
+
+        request.respond(200, {})
+
+
+    def _response_load(self, path, filename, default=""):
+        path = path+filename
+        ret = default
+        if os.path.isfile(path):
+            with open(path, "r") as f:
+                ret = f.read()
+        return ret
+
+
+    def _response_store(self, path, filename, data, channelname=""):
+        path = path+filename
+        data = str(data).strip()
+        if data == "" or data == "None" or data == "0":
+            if os.path.isfile(path):
+                os.remove(path)
+                self.bot.debug_chan("``lva-feedback::"+channelname+filename+"`` result deleted.")
+        else:
+            with open(path, "w") as f:
+                f.write(data)
+            self.bot.debug_chan("``lva-feedback::"+channelname+filename+"`` result stored.\n```\n"+data+"\n```")