--- /dev/null
+# 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```")