)]}'
{"docker/accessbot/accessbot.py":[{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"0500388afd0d7d21fe0e5d1ebda40cbeb1d450e2","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        nick \u003d e.source.split(\u0027!\u0027)[0]"},{"line_number":79,"context_line":"        auth \u003d e.arguments[0][0]"},{"line_number":80,"context_line":"        msg \u003d e.arguments[0][1:]"},{"line_number":81,"context_line":"        if auth \u003d\u003d \u0027+\u0027 and nick \u003d\u003d \u0027NickServ\u0027 and not self.identified:"},{"line_number":82,"context_line":"            if msg.startswith(\u0027You are now identified\u0027):"},{"line_number":83,"context_line":"                self.identified \u003d True"},{"line_number":84,"context_line":"                # Prejoin and set ourselves as op in these channels,"}],"source_content_type":"text/x-python","patch_set":4,"id":"43be528f_babd756c","side":"PARENT","line":81,"updated":"2021-05-28 01:11:29.000000000","message":"I\u0027ll add a TODO for this so we hopefully get to it later.","commit_id":"88139ef6228373193cc358d5b695301991d1e808"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"5b129f9961be0d507c23baa3f5293c50ea83a0ec","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        nick \u003d e.source.split(\u0027!\u0027)[0]"},{"line_number":79,"context_line":"        auth \u003d e.arguments[0][0]"},{"line_number":80,"context_line":"        msg \u003d e.arguments[0][1:]"},{"line_number":81,"context_line":"        if auth \u003d\u003d \u0027+\u0027 and nick \u003d\u003d \u0027NickServ\u0027 and not self.identified:"},{"line_number":82,"context_line":"            if msg.startswith(\u0027You are now identified\u0027):"},{"line_number":83,"context_line":"                self.identified \u003d True"},{"line_number":84,"context_line":"                # Prejoin and set ourselves as op in these channels,"}],"source_content_type":"text/x-python","patch_set":4,"id":"67522586_d612d284","side":"PARENT","line":81,"updated":"2021-05-27 20:26:51.000000000","message":"No \"+\" or equiv with oftc to tell us nickserv itself is authenticated?  That helps us avoid sending our password to an imposter.","commit_id":"88139ef6228373193cc358d5b695301991d1e808"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"8075aa33a63cc4dd17c73eeedde79e29b6427a11","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        nick \u003d e.source.split(\u0027!\u0027)[0]"},{"line_number":79,"context_line":"        auth \u003d e.arguments[0][0]"},{"line_number":80,"context_line":"        msg \u003d e.arguments[0][1:]"},{"line_number":81,"context_line":"        if auth \u003d\u003d \u0027+\u0027 and nick \u003d\u003d \u0027NickServ\u0027 and not self.identified:"},{"line_number":82,"context_line":"            if msg.startswith(\u0027You are now identified\u0027):"},{"line_number":83,"context_line":"                self.identified \u003d True"},{"line_number":84,"context_line":"                # Prejoin and set ourselves as op in these channels,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ee797442_5bfe8601","side":"PARENT","line":81,"updated":"2021-05-27 21:48:06.000000000","message":"Not that I was able to find. There is no identify-msg cap equivalent in their ircd anyway. I agree an imposter NickServ is probably worth worrying about, we could probably figure out how to set up CertFP auth for accessbot instead, though I doubt I\u0027ll have time to get that working before this weekend.","commit_id":"88139ef6228373193cc358d5b695301991d1e808"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"0500388afd0d7d21fe0e5d1ebda40cbeb1d450e2","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            raise Exception(\"Unknown channel %s\" % (channel_name,))"},{"line_number":108,"context_line":"        mask \u003d \u0027\u0027"},{"line_number":109,"context_line":"        for access, nicks in (list(self.config[\u0027global\u0027].items()) +"},{"line_number":110,"context_line":"                              list(channel.items())):"},{"line_number":111,"context_line":"            if access \u003d\u003d \u0027mask\u0027:"},{"line_number":112,"context_line":"                mask \u003d self.config[\u0027access\u0027].get(nicks)"},{"line_number":113,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":4,"id":"722319e8_b2ab6e24","side":"PARENT","line":110,"updated":"2021-05-28 01:11:29.000000000","message":"I\u0027ll leave a message to our future selves about this.","commit_id":"88139ef6228373193cc358d5b695301991d1e808"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"8075aa33a63cc4dd17c73eeedde79e29b6427a11","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            raise Exception(\"Unknown channel %s\" % (channel_name,))"},{"line_number":108,"context_line":"        mask \u003d \u0027\u0027"},{"line_number":109,"context_line":"        for access, nicks in (list(self.config[\u0027global\u0027].items()) +"},{"line_number":110,"context_line":"                              list(channel.items())):"},{"line_number":111,"context_line":"            if access \u003d\u003d \u0027mask\u0027:"},{"line_number":112,"context_line":"                mask \u003d self.config[\u0027access\u0027].get(nicks)"},{"line_number":113,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":4,"id":"cfd7439c_c02160a0","side":"PARENT","line":110,"updated":"2021-05-27 21:48:06.000000000","message":"Yes, I think it\u0027s because the mode functionality was tacked on later.","commit_id":"88139ef6228373193cc358d5b695301991d1e808"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"b2edf46ed1880d25138ebc7f4ab51b870330ae21","unresolved":true,"context_lines":[{"line_number":93,"context_line":"        if channel is None:"},{"line_number":94,"context_line":"            raise Exception(\"Unknown channel %s\" % (channel_name,))"},{"line_number":95,"context_line":"        level \u003d \u0027\u0027"},{"line_number":96,"context_line":"        for access, nicks in (list(self.config[\u0027global\u0027].items()) +"},{"line_number":97,"context_line":"                              list(channel.items())):"},{"line_number":98,"context_line":"            # TODO (fungi): This model needs to be reworked to support"},{"line_number":99,"context_line":"            # per-channel access lists, by comparing the access key with the"}],"source_content_type":"text/x-python","patch_set":4,"id":"426c45c6_e9cd7f0e","line":96,"range":{"start_line":96,"start_character":12,"end_line":96,"end_character":25},"updated":"2021-05-27 20:01:02.000000000","message":"The config file is actually doing more than access, nicks in the items() for these dicts. I have been very confused reading over this to do review. I don\u0027t think you should try to fix this in this change, but might be good to think about ways to make this particular iteration easier to undersatnd in the context of our config?","commit_id":"fced067a4f352d131d39be33fcc8bca2d0313792"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"8075aa33a63cc4dd17c73eeedde79e29b6427a11","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        level \u003d \u0027\u0027"},{"line_number":96,"context_line":"        for access, nicks in (list(self.config[\u0027global\u0027].items()) +"},{"line_number":97,"context_line":"                              list(channel.items())):"},{"line_number":98,"context_line":"            # TODO (fungi): This model needs to be reworked to support"},{"line_number":99,"context_line":"            # per-channel access lists, by comparing the access key with the"},{"line_number":100,"context_line":"            # config\u0027s access mapping keys and then applying the appropriate"},{"line_number":101,"context_line":"            # level for each nick"}],"source_content_type":"text/x-python","patch_set":4,"id":"96d8f005_66625bd6","line":98,"updated":"2021-05-27 21:48:06.000000000","message":"Huh, I thought I removed this TODO comment. It\u0027s working, will clean up.","commit_id":"fced067a4f352d131d39be33fcc8bca2d0313792"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"8075aa33a63cc4dd17c73eeedde79e29b6427a11","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                continue"},{"line_number":112,"context_line":"            for nick in nicks:"},{"line_number":113,"context_line":"                ret[nick] \u003d level"},{"line_number":114,"context_line":"        return level, ret, alumni, mode"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _get_access_change(self, current, target):"},{"line_number":117,"context_line":"        if current !\u003d target:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3472e036_b8c0c1c5","line":114,"updated":"2021-05-27 21:48:06.000000000","message":"I agree, I started to rip it out and then got confused by how its reused later by the caller. I\u0027ll see if I can work out how to safely extract it.","commit_id":"fced067a4f352d131d39be33fcc8bca2d0313792"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"b2edf46ed1880d25138ebc7f4ab51b870330ae21","unresolved":true,"context_lines":[{"line_number":111,"context_line":"                continue"},{"line_number":112,"context_line":"            for nick in nicks:"},{"line_number":113,"context_line":"                ret[nick] \u003d level"},{"line_number":114,"context_line":"        return level, ret, alumni, mode"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def _get_access_change(self, current, target):"},{"line_number":117,"context_line":"        if current !\u003d target:"}],"source_content_type":"text/x-python","patch_set":4,"id":"e2a39e62_ed62c010","line":114,"range":{"start_line":114,"start_character":15,"end_line":114,"end_character":20},"updated":"2021-05-27 20:01:02.000000000","message":"Returning level here is weidr because you\u0027ll return the last level iterated through. Then late we\u0027ll log that as the level we\u0027re updating even if ret contains many more levels.\n\nMaybe simplify and remove this first return option?","commit_id":"fced067a4f352d131d39be33fcc8bca2d0313792"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"b2edf46ed1880d25138ebc7f4ab51b870330ae21","unresolved":true,"context_lines":[{"line_number":120,"context_line":"    def _get_access_changes(self):"},{"line_number":121,"context_line":"        level, target, alumni, mode \u003d self._get_access_list("},{"line_number":122,"context_line":"            self.current_channel)"},{"line_number":123,"context_line":"        self.log.debug(\"Level for %s: %s\" % (self.current_channel, level))"},{"line_number":124,"context_line":"        self.log.debug(\"Target for %s: %s\" % (self.current_channel, target))"},{"line_number":125,"context_line":"        all_nicks \u003d set()"},{"line_number":126,"context_line":"        global_alumni \u003d self.config.get(\u0027alumni\u0027, {})"}],"source_content_type":"text/x-python","patch_set":4,"id":"01755106_b93f2720","line":123,"updated":"2021-05-27 20:01:02.000000000","message":"This is the log entry I speak about above.","commit_id":"fced067a4f352d131d39be33fcc8bca2d0313792"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a9a0de3cce8a4a5f6408f749aa064f850b86f7d4","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    def _get_access_changes(self):"},{"line_number":121,"context_line":"        level, target, alumni, mode \u003d self._get_access_list("},{"line_number":122,"context_line":"            self.current_channel)"},{"line_number":123,"context_line":"        self.log.debug(\"Level for %s: %s\" % (self.current_channel, level))"},{"line_number":124,"context_line":"        self.log.debug(\"Target for %s: %s\" % (self.current_channel, target))"},{"line_number":125,"context_line":"        all_nicks \u003d set()"},{"line_number":126,"context_line":"        global_alumni \u003d self.config.get(\u0027alumni\u0027, {})"}],"source_content_type":"text/x-python","patch_set":4,"id":"303a886d_a114c30b","line":123,"updated":"2021-05-28 02:08:40.000000000","message":"Yep, I\u0027ve got something better in the next revision, see it it makes more sense.","commit_id":"fced067a4f352d131d39be33fcc8bca2d0313792"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"0500388afd0d7d21fe0e5d1ebda40cbeb1d450e2","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            self.current_channel \u003d self.channels.pop()"},{"line_number":179,"context_line":"            self.current_mode \u003d \u0027\u0027"},{"line_number":180,"context_line":"            self.connection.privmsg(\u0027chanserv\u0027, \u0027set #%s mlock\u0027 %"},{"line_number":181,"context_line":"                                    self.current_channel)"},{"line_number":182,"context_line":"            self.current_list \u003d []"},{"line_number":183,"context_line":"            self.connection.privmsg(\u0027chanserv\u0027, \u0027access #%s list\u0027 %"},{"line_number":184,"context_line":"                                    self.current_channel)"}],"source_content_type":"text/x-python","patch_set":4,"id":"aa900092_bc115e37","line":181,"updated":"2021-05-28 01:11:29.000000000","message":"Adding a comment in the next patchset to explain why.","commit_id":"fced067a4f352d131d39be33fcc8bca2d0313792"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"8075aa33a63cc4dd17c73eeedde79e29b6427a11","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            self.current_channel \u003d self.channels.pop()"},{"line_number":179,"context_line":"            self.current_mode \u003d \u0027\u0027"},{"line_number":180,"context_line":"            self.connection.privmsg(\u0027chanserv\u0027, \u0027set #%s mlock\u0027 %"},{"line_number":181,"context_line":"                                    self.current_channel)"},{"line_number":182,"context_line":"            self.current_list \u003d []"},{"line_number":183,"context_line":"            self.connection.privmsg(\u0027chanserv\u0027, \u0027access #%s list\u0027 %"},{"line_number":184,"context_line":"                                    self.current_channel)"}],"source_content_type":"text/x-python","patch_set":4,"id":"d372062d_cd4c25af","line":181,"updated":"2021-05-27 21:48:06.000000000","message":"I\u0027m setting it empty for consistency with the subsequent access list call which is used to populate current_list similarly. The main concern is that if the set mlock call doesn\u0027t generate any response we could otherwise end up applying the wrong channel\u0027s mode mask.","commit_id":"fced067a4f352d131d39be33fcc8bca2d0313792"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"a9a0de3cce8a4a5f6408f749aa064f850b86f7d4","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            self.current_channel \u003d self.channels.pop()"},{"line_number":179,"context_line":"            self.current_mode \u003d \u0027\u0027"},{"line_number":180,"context_line":"            self.connection.privmsg(\u0027chanserv\u0027, \u0027set #%s mlock\u0027 %"},{"line_number":181,"context_line":"                                    self.current_channel)"},{"line_number":182,"context_line":"            self.current_list \u003d []"},{"line_number":183,"context_line":"            self.connection.privmsg(\u0027chanserv\u0027, \u0027access #%s list\u0027 %"},{"line_number":184,"context_line":"                                    self.current_channel)"}],"source_content_type":"text/x-python","patch_set":4,"id":"f10cac1a_9b321ebb","line":181,"updated":"2021-05-28 02:08:40.000000000","message":"Oh! Now I understand what you\u0027re asking... this isn\u0027t setting an empty mlock, it\u0027s actually how we ask what the current mlock is set to. I\u0027ll add yet another code comment about that as well.","commit_id":"fced067a4f352d131d39be33fcc8bca2d0313792"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"b2edf46ed1880d25138ebc7f4ab51b870330ae21","unresolved":true,"context_lines":[{"line_number":178,"context_line":"            self.current_channel \u003d self.channels.pop()"},{"line_number":179,"context_line":"            self.current_mode \u003d \u0027\u0027"},{"line_number":180,"context_line":"            self.connection.privmsg(\u0027chanserv\u0027, \u0027set #%s mlock\u0027 %"},{"line_number":181,"context_line":"                                    self.current_channel)"},{"line_number":182,"context_line":"            self.current_list \u003d []"},{"line_number":183,"context_line":"            self.connection.privmsg(\u0027chanserv\u0027, \u0027access #%s list\u0027 %"},{"line_number":184,"context_line":"                                    self.current_channel)"}],"source_content_type":"text/x-python","patch_set":4,"id":"549558ca_60e0d857","line":181,"updated":"2021-05-27 20:01:02.000000000","message":"Why do we need to set the empty mlock here? does this return the current mode?","commit_id":"fced067a4f352d131d39be33fcc8bca2d0313792"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"0500388afd0d7d21fe0e5d1ebda40cbeb1d450e2","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                                    self.current_channel)"},{"line_number":185,"context_line":"            time.sleep(1)"},{"line_number":186,"context_line":"            return"},{"line_number":187,"context_line":"        parts \u003d msg.split()"},{"line_number":188,"context_line":"        if parts[2] in (\u0027MASTER\u0027, \u0027CHANOP\u0027, \u0027MEMBER\u0027):"},{"line_number":189,"context_line":"            self.current_list.append((parts[1], parts[2], msg))"},{"line_number":190,"context_line":"        elif msg.startswith(\u0027MLOCK is SET to\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"cf3c07c5_5ba46852","line":187,"updated":"2021-05-28 01:11:29.000000000","message":"I\u0027ll add a comment about this as well.","commit_id":"fced067a4f352d131d39be33fcc8bca2d0313792"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"b2edf46ed1880d25138ebc7f4ab51b870330ae21","unresolved":true,"context_lines":[{"line_number":184,"context_line":"                                    self.current_channel)"},{"line_number":185,"context_line":"            time.sleep(1)"},{"line_number":186,"context_line":"            return"},{"line_number":187,"context_line":"        parts \u003d msg.split()"},{"line_number":188,"context_line":"        if parts[2] in (\u0027MASTER\u0027, \u0027CHANOP\u0027, \u0027MEMBER\u0027):"},{"line_number":189,"context_line":"            self.current_list.append((parts[1], parts[2], msg))"},{"line_number":190,"context_line":"        elif msg.startswith(\u0027MLOCK is SET to\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"268299e6_c1debf72","line":187,"updated":"2021-05-27 20:01:02.000000000","message":"Might want to name the individual parts here so that the conditions and updates below are easier to read.","commit_id":"fced067a4f352d131d39be33fcc8bca2d0313792"},{"author":{"_account_id":5263,"name":"Jeremy Stanley","display_name":"fungi","email":"fungi@yuggoth.org","username":"fungi","status":"missing, presumed fed"},"change_message_id":"8075aa33a63cc4dd17c73eeedde79e29b6427a11","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                                    self.current_channel)"},{"line_number":185,"context_line":"            time.sleep(1)"},{"line_number":186,"context_line":"            return"},{"line_number":187,"context_line":"        parts \u003d msg.split()"},{"line_number":188,"context_line":"        if parts[2] in (\u0027MASTER\u0027, \u0027CHANOP\u0027, \u0027MEMBER\u0027):"},{"line_number":189,"context_line":"            self.current_list.append((parts[1], parts[2], msg))"},{"line_number":190,"context_line":"        elif msg.startswith(\u0027MLOCK is SET to\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"c827734b_bbcbfc33","line":187,"updated":"2021-05-27 21:48:06.000000000","message":"We could, except that it\u0027s really just splitting an arbitrary response message into its constituent words and parts[2] of a message which is a line of output from an access list won\u0027t be the same as parts[2] in the response asking for the mlock string, but we wind up putting every response from the server through this same gauntlet, so it\u0027s not clear to me what to name the individual words.","commit_id":"fced067a4f352d131d39be33fcc8bca2d0313792"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"77d6b92aea41b4631ccd7e153367f1597c195383","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            else:"},{"line_number":81,"context_line":"                return"},{"line_number":82,"context_line":"        if nick not in (\u0027ChanServ\u0027, \u0027NickServ\u0027):"},{"line_number":83,"context_line":"            self.log.debug(\"Ignoring message from non-ChanServ \""},{"line_number":84,"context_line":"                           \"user %s\" % nick)"},{"line_number":85,"context_line":"            return"},{"line_number":86,"context_line":"        self.failed \u003d False"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ebae2_bd1c2b2b","line":83,"updated":"2021-05-28 13:55:58.000000000","message":"nit: might want to write this as \"... from non-service user\"","commit_id":"258e8e8585cb065256b09b46147f65cf377fd8ea"}]}
