示例#1
0
async def sort_roles(server):
    """
    Sort roles alphabetically
    """

    # Get all roles
    rlist = {}
    for chan in chain(server.get_chans_in_cat(PUB_CAT),
                      server.get_chans_in_cat(PRV_CAT)):
        rlist["%s-op" % chan.name] = \
            dutils.get_role_by_name(server, "%s-op" % chan.name)

        member_role = dutils.get_role_by_name(server, "%s-member" % chan.name)
        if member_role:
            rlist["%s-member" % chan.name] = member_role

    # Sort them and position starting from the first alphanumeric role
    print("Base position is %s" % str(sorted(rlist.keys())[0]))
    crt_pos = rlist[sorted(rlist.keys())[0]].position
    for rname in sorted(rlist.keys()):
        print("Setting %s to %d" % (rname, crt_pos))

        if crt_pos != rlist[rname].position:
            await rlist[rname].set_position(crt_pos)

        crt_pos -= 1
示例#2
0
    def serialize(self):
        data = {}
        data["server_id"] = self.server.id
        data["channel_id"] = self.channel.id
        data["first_role_id"] = dutils.get_role_by_name(self.server, self.first_role).id
        data["last_role_id"] = dutils.get_role_by_name(self.server, self.last_role).id
        data["max_selectable"] = self.max_selectable
        data["title"] = self.title
        data["msg_id"] = self.get_msg_id()
        data["shown_page"] = self.shown_page

        return data
示例#3
0
def check_exp_time(rstorage, command_name, role, server):
    if command_name not in rstorage:
        return

    tnow = datetime.datetime.now().timestamp()
    to_del = []

    for elem in rstorage[command_name]:
        if elem['expire'] < tnow:
            to_del.append(elem)

    for elem in to_del:
        role = dutils.get_role_by_name(server, role)
        member = dutils.get_user_by_id(server, elem["user"])

        new_roles = []
        for role_id in elem['crt_roles']:
            role = dutils.get_role_by_id(server, role_id)
            if role:
                new_roles.append(role)

        if member:
            member.replace_roles(new_roles)

        rstorage[command_name].remove(elem)
        rstorage.sync()
示例#4
0
async def verified(server, author, event):
    """Get server access rights"""
    verif = get_role_by_name(server, "Verified")

    author.add_role(verif)

    await event.msg.async_add_reaction(u"👍")
示例#5
0
async def votat(author, event, server):
    role = dutils.get_role_by_name(server, "A votat")
    author.add_role(role)

    try:
        await event.msg.async_add_reaction(u"👍")
    except:
        import traceback
        traceback.print_exc()
示例#6
0
def make_nsfw(server, storage, reply, event, text, send_message):
    """
    <topic> - make channel NSFW (only channel OPs can do it)
    """

    target_chan, categ = find_irc_chan(server,
                                       storage,
                                       chan_id=event.channel.id)
    if not target_chan:
        return "You're not in a user managed channel"

    if categ["type"] == PUB_CAT:
        return "Only private channels can be made NSFW"

    # Check if user is OP
    has_right = user_has_role(event.author, "%s-op" % event.channel.name)

    if not has_right:
        return "Only channel OPs can do that"

    # Set NSFW
    target_chan.set_nsfw(True)

    # Add NSFW to topic
    if target_chan.topic and "NSFW" not in target_chan.topic:
        target_chan.set_topic(text + " [NSFW]")

    # Purge non-NSFW users
    member_role = dutils.get_role_by_name(server,
                                          "%s-member" % target_chan.name)
    op_role = dutils.get_role_by_name(server, "%s-op" % target_chan.name)
    for user in target_chan.members_accessing_chan():
        for urole in user.roles:
            if urole.name == NSFW_FORBID_ROLE:
                user.remove_role(member_role)
                user.remove_role(op_role)
                send_message("Part <@%s> - because channel was made NSFW" %
                             user.id,
                             target=target_chan.id)

                user.send_pm(
                    "You have been removed from %s, because the channel was made NSFW."
                    % target_chan.name)
示例#7
0
async def ok(event, text, str_to_id, server):
    try:
        role = dutils.get_role_by_name(server, "Valoare")
        user = dutils.get_user_by_id(server, str_to_id(text))

        await event.msg.async_add_reaction(u"👍")

        user.add_role(role)
    except:
        import traceback
        traceback.print_exc()
示例#8
0
def auto_ok(server, event, send_message, storage):
    if server.id != RODDIT_ID:
        return

    creation_date = datetime.datetime.utcfromtimestamp(
        int((int(event.member.id) >> 22) + 1420070400000) / 1000)
    age = (datetime.datetime.now() - creation_date).total_seconds()

    abulau = storage["join_params"]["abulau"]
    avaloare = storage["join_params"]["aval"]

    if age < abulau:
        role = dutils.get_role_by_name(server, "Bulău")
        event.member.add_role(role)
        send_message(target="449899630176632842",
                     text="Auto-bulau given to <@%s>" % event.member.id)
    elif age < avaloare:
        send_message(target="449899630176632842",
                     text="Auto-valoare not given to <@%s>" % event.member.id)
    else:
        role = dutils.get_role_by_name(server, "Valoare")
        event.member.add_role(role)
        send_message(target="449899630176632842",
                     text="Auto-valoare given to <@%s>" % event.member.id)
示例#9
0
async def create_channel(text, server, reply):
    """
    <name type founder> - create a channel by specifying a 'name', type (either 'public' or 'private') and who is the channel founder
    """
    # Check input
    text = text.split(" ")
    if len(text) != 3:
        return create_channel.__doc__

    # Parse data
    chname = text[0].lower()
    chtype = text[1].lower()
    user = dutils.get_user_by_id(server, dutils.str_to_id(text[2]))

    if not user:
        reply("Could not find given user")
        return

    if chtype not in CHTYPES:
        reply("Channel type must be one of: %s" % str(CHTYPES))
        return

    # Check dupes
    for chan in chain(server.get_chans_in_cat(PUB_CAT),
                      server.get_chans_in_cat(PRV_CAT)):
        if chan.name == chname:
            reply("A channel by that name already exists")
            return

    await server.create_role("%s-op" % chname, mentionable=True)

    if chtype == PUB_CAT:
        await server.create_text_channel(chname, PUB_CAT)
    elif chtype == PRV_CAT:
        await server.create_text_channel(chname, PRV_CAT)
        await server.create_role("%s-member" % chname, mentionable=True)

    print("Created roles")
    await sort_roles(server)
    await sort_chans(server, PUB_CAT)
    await sort_chans(server, PRV_CAT)
    await resync_roles(server)

    # Add the OP
    user.add_role(dutils.get_role_by_name(server, "%s-op" % chname))
    print("Should be done!")
示例#10
0
def create_temp_role_cmd(text, hook, str_to_id, server, bot, storage):
    """
    <command name, role> - create a command that assigns a temporary role by specifying `command_name role`
    """

    text = text.split()

    # Check if length is correct
    if len(text) < 2:
        return create_temp_role_cmd.__doc__

    cmd = text[0]

    # Check minumum length
    if len(cmd) < 5:
        return "Command length needs to be at least 5."

    # Check that command exists

    if hook.root.get_command(cmd) != None:
        return "Command `%s` already exists. Try using another name." % cmd

    # Get the given role
    role = dutils.get_role_by_id(server, str_to_id(text[1]))
    if not role:
        role = dutils.get_role_by_name(server, text[1])

    if not role:
        return "No such role " + text[1]

    if "cmds" not in storage:
        storage["cmds"] = {}

    # Create new object
    new_cmd = {}
    new_cmd["cmd_type"] = "temporary"
    new_cmd["name"] = cmd
    new_cmd["role_id"] = role.id
    new_cmd["role_name"] = role.name

    storage["cmds"][cmd] = new_cmd
    storage.sync()

    register_cmd(new_cmd, server)

    return "Done"
示例#11
0
def assign_temp_role(rstorage, server, bot, role, text, command_name,
                     str_to_id, event):
    data = text.split(" ")

    if len(data) < 2:
        return "Needs at least user and time (and reason) (e.g. .{CMD} @plp, 5m - to give @plp {CMD} for 5 minutes OR .{CMD} @plp 5m bad user - to give @plp {CMD} for 5m and save the reason \"bad user\")".format(
            CMD=command_name), None

    reason = "Not given"
    if len(data) >= 3:
        reason = " ".join(data[2:])

    user = str_to_id(data[0])
    stime = data[1]

    total_seconds = 0

    last_start = 0
    for pos, char in enumerate(stime):
        if char in time_tokens:
            value = int(stime[last_start:pos])
            if char == 's':
                total_seconds += value
            elif char == 'm':
                total_seconds += value * SEC_IN_MIN
            elif char == 'h':
                total_seconds += value * SEC_IN_HOUR
            elif char == 'd':
                total_seconds += value * SEC_IN_DAY

            last_start = pos + 1

    texp = datetime.datetime.now().timestamp() + total_seconds

    brole = dutils.get_role_by_name(server, role)
    member = dutils.get_user_by_id(server, user)

    if brole == None or member == None:
        print("Internal error " + str(brole) + str(member))
        return "Internal error.", None

    extra = False
    crt_roles = []

    if user in rstorage:
        extra = True

    for role in member.roles:
        #        if brole.id == role.id:
        #            extra = True
        #            break
        crt_roles.append(role.id)

    if command_name not in rstorage:
        rstorage[command_name] = []

    for entry in rstorage[command_name]:
        if entry["user"] == user:
            extra = True
            break

    if not extra:
        reason_entry = add_reason(rstorage, event, member, reason, server,
                                  texp, brole.name)

        new_entry = {}
        new_entry["user"] = user
        new_entry["expire"] = texp
        new_entry["crt_roles"] = crt_roles
        new_entry["reason_id"] = reason_entry["Case ID"]

        rstorage[command_name].append(new_entry)
        member.replace_roles([brole])

        rstorage.sync()
        return "Gave <@%s> %s seconds %s time" % (user, str(total_seconds),
                                                  command_name), reason_entry
    else:
        reason_entry = adjust_time(rstorage, event, user, command_name, texp)
        return "Adjusted time for user to %d" % total_seconds, reason_entry

    return "wat"
示例#12
0
    async def do_stuff(self, event, label):
        # Check for role assign spam
        if await self.is_spam(event):
            return

        # Get the channel name
        chname = label.split("**")[1]

        # Lookup channel
        target_chan, categ = find_irc_chan(self.server,
                                           self.storage,
                                           chan_name=chname)

        if not target_chan:
            return

        if categ["type"] == PRV_CAT:
            # Check if user is an OP
            if dutils.user_has_role_name(event.author, "%s-op" % chname):
                await event.async_send_message(
                    "<@%s>: OPs can't join/leave a channel that they operate."
                    % (event.author.id),
                    timeout=MSG_TIMEOUT,
                    check_old=False)
                return

            # Check for minimum requirements
            can_access = False
            for access_role in REQUIRED_ACCESS_ROLES:
                if dutils.user_has_role_name(event.author, access_role):
                    can_access = True

            if not can_access:
                await event.async_send_message(
                    "<@%s>: You can't join/leave a channel" %
                    (event.author.id),
                    timeout=MSG_TIMEOUT,
                    check_old=False)
                return

            # Check for NSFW chans
            if target_chan.is_nsfw:
                if dutils.user_has_role_name(event.author, NSFW_FORBID_ROLE):
                    await event.async_send_message(
                        "<@%s>: You cant join a NSFW channel" %
                        (event.author.id),
                        timeout=MSG_TIMEOUT,
                        check_old=False)
                    return

            # Check if user is a member
            if dutils.user_has_role_name(event.author, "%s-member" % chname):
                event.author.remove_role(
                    dutils.get_role_by_name(self.server, "%s-member" % chname))

                await event.async_send_message("<@%s>: Removed you from `%s`" %
                                               (event.author.id, chname),
                                               timeout=MSG_TIMEOUT,
                                               check_old=False)
                return

            # Add the role
            event.author.add_role(
                dutils.get_role_by_name(self.server,
                                        "%s-member" % target_chan.name))

            await event.async_send_message("<@%s>: Added you to `%s`" %
                                           (event.author.id, chname),
                                           timeout=MSG_TIMEOUT,
                                           check_old=False)

        elif categ["type"] == PUB_CAT:
            # Check if the user wants to leave
            in_channel = True
            for user in target_chan.get_removed_users():
                if user.id == event.author.id:
                    in_channel = False

            if in_channel:
                target_chan.remove_user_by_permission(event.author)
                await event.async_send_message("<@%s>: Removed you from `%s`" %
                                               (event.author.id, chname),
                                               timeout=MSG_TIMEOUT,
                                               check_old=False)
                return

            else:
                target_chan.add_user_by_permission(event.author)
                await event.async_send_message("<@%s>: Added you to `%s`" %
                                               (event.author.id, chname),
                                               timeout=MSG_TIMEOUT,
                                               check_old=False)