File: pyeval.py

package info (click to toggle)
znc 1.10.1-1
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 12,164 kB
  • sloc: cpp: 58,072; javascript: 11,859; python: 1,635; perl: 1,229; tcl: 219; sh: 200; ansic: 187; makefile: 82
file content (82 lines) | stat: -rw-r--r-- 2,421 bytes parent folder | download
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
#
# Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#


import sys
import re
from code import InteractiveInterpreter

import znc


class pyeval(znc.Module, InteractiveInterpreter):
    module_types = [znc.CModInfo.UserModule, znc.CModInfo.NetworkModule]
    wiki_page = 'pyeval'

    def write(self, data):
        for line in data.split('\n'):
            if len(line):
                self.PutModule(line)

    def resetbuffer(self):
        """Reset the input buffer."""
        self.buffer = []

    def push(self, line):
        self.buffer.append(line)
        source = "\n".join(self.buffer)
        more = self.runsource(source, self.filename)
        if not more:
            self.resetbuffer()
        return more

    def OnLoad(self, args, message):
        if not self.GetUser().IsAdmin():
            message.s = self.t_s(
                    'You must have admin privileges to load this module.')
            return False

        self.filename = "<console>"
        self.resetbuffer()
        self.locals['znc'] = znc
        self.locals['module'] = self
        self.locals['user'] = self.GetUser()
        self.indent = re.compile(r'^>+')

        return True

    def OnModCommand(self, line):
        self.locals['client'] = self.GetClient()
        self.locals['network'] = self.GetNetwork()

        # Hijack sys.stdout.write
        stdout_write = sys.stdout.write
        sys.stdout.write = self.write

        m = self.indent.match(line)
        if m:
            self.push(('    ' * len(m.group())) + line[len(m.group()):])
        elif line == ' ' or line == '<':
            self.push('')
        else:
            self.push(line)

        # Revert sys.stdout.write
        sys.stdout.write = stdout_write
        del self.locals['client']
        del self.locals['network']

pyeval.description = pyeval.t_s('Evaluates python code')