Merge pull request #8 from Ianardo-DiCaprio/patch-6

Add optional bot count and online count
pull/65/head
Ianardo DiCaprio 6 years ago committed by GitHub
commit 5c68cca178
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,17 +1,17 @@
from typing import Any from typing import Any
import discord import discord
from redbot.core import Config, commands, checks from redbot.core import Config, commands, checks
from redbot.core.bot import Red from redbot.core.bot import Red
Cog: Any = getattr(commands, "Cog", object) Cog: Any = getattr(commands, "Cog", object)
listener = getattr(commands.Cog, "listener", None) # Trusty + Sinbad listener = getattr(commands.Cog, "listener", None) # Trusty + Sinbad
if listener is None: if listener is None:
def listener(name=None): def listener(name=None):
return lambda x: x return lambda x: x
class InfoChannel(Cog): class InfoChannel(Cog):
""" """
Create a channel with updating server info Create a channel with updating server info
@ -27,7 +27,11 @@ class InfoChannel(Cog):
default_guild = { default_guild = {
"channel_id": None, "channel_id": None,
"botchannel_id": None,
"onlinechannel_id": None,
"member_count": True, "member_count": True,
"bot_count": False,
"online_count": False,
} }
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
@ -58,7 +62,7 @@ class InfoChannel(Cog):
elif channel_id is None: elif channel_id is None:
await ctx.send("Enable info channel on this server?") await ctx.send("Enable info channel on this server?")
else: else:
await ctx.send("Info channel is {}. Delete it?".format(channel.mention)) await ctx.send("Do you wish to delete current info channels?")
msg = await self.bot.wait_for("message", check=check) msg = await self.bot.wait_for("message", check=check)
@ -74,43 +78,127 @@ class InfoChannel(Cog):
if not await ctx.tick(): if not await ctx.tick():
await ctx.send("Done!") await ctx.send("Done!")
@commands.group()
@checks.admin()
async def infochannelset(self, ctx: commands.Context):
"""
Toggle different types of infochannels
"""
@infochannelset.command(name="botcount")
async def _infochannelset_botcount(self, ctx: commands.Context, enabled: bool = None):
"""
Toggle an infochannel that shows the amount of bots in the server
"""
guild = ctx.guild
if enabled is None:
enabled = not await self.config.guild(guild).bot_count()
await self.config.guild(guild).bot_count.set(enabled)
if enabled:
await ctx.send("InfoChannel for bot count has been enabled.")
else:
await ctx.send("InfoChannel for bot count has been disabled.")
@infochannelset.command(name="onlinecount")
async def _infochannelset_onlinecount(self, ctx: commands.Context, enabled: bool = None):
"""
Toggle an infochannel that shows the amount of online users in the server
"""
guild = ctx.guild
if enabled is None:
enabled = not await self.config.guild(guild).online_count()
await self.config.guild(guild).online_count.set(enabled)
if enabled:
await ctx.send("InfoChannel for online user count has been enabled.")
else:
await ctx.send("InfoChannel for online user count has been disabled.")
async def make_infochannel(self, guild: discord.Guild): async def make_infochannel(self, guild: discord.Guild):
overwrites = {guild.default_role: discord.PermissionOverwrite(connect=False), botcount = await self.config.guild(guild).bot_count()
guild.me: discord.PermissionOverwrite(manage_channels=True, connect=True)} onlinecount = await self.config.guild(guild).online_count()
overwrites = {
guild.default_role: discord.PermissionOverwrite(connect=False),
guild.me: discord.PermissionOverwrite(manage_channels=True, connect=True),
}
channel = await guild.create_voice_channel( channel = await guild.create_voice_channel(
"Placeholder", reason="InfoChannel make", overwrites=overwrites "Placeholder", reason="InfoChannel make", overwrites=overwrites
) )
await self.config.guild(guild).channel_id.set(channel.id) await self.config.guild(guild).channel_id.set(channel.id)
if botcount:
botchannel = await guild.create_voice_channel(
"Placeholder", reason="InfoChannel botcount", overwrites=overwrites
)
await self.config.guild(guild).botchannel_id.set(botchannel.id)
if onlinecount:
onlinechannel = await guild.create_voice_channel(
"Placeholder", reason="InfoChannel onlinecount", overwrites=overwrites
)
await self.config.guild(guild).onlinechannel_id.set(onlinechannel.id)
await self.update_infochannel(guild) await self.update_infochannel(guild)
async def delete_infochannel(self, guild: discord.Guild, channel: discord.VoiceChannel): async def delete_infochannel(self, guild: discord.Guild, channel: discord.VoiceChannel):
guild_data = await self.config.guild(guild).all()
botchannel_id = guild_data["botchannel_id"]
onlinechannel_id = guild_data["onlinechannel_id"]
botchannel: discord.VoiceChannel = guild.get_channel(botchannel_id)
onlinechannel: discord.VoiceChannel = guild.get_channel(onlinechannel_id)
channel_id = guild_data["channel_id"]
channel: discord.VoiceChannel = guild.get_channel(channel_id)
await channel.delete(reason="InfoChannel delete") await channel.delete(reason="InfoChannel delete")
if botchannel_id is not None:
await botchannel.delete(reason="InfoChannel delete")
if onlinechannel_id is not None:
await onlinechannel.delete(reason="InfoChannel delete")
await self.config.guild(guild).clear() await self.config.guild(guild).clear()
async def update_infochannel(self, guild: discord.Guild): async def update_infochannel(self, guild: discord.Guild):
guild_data = await self.config.guild(guild).all() guild_data = await self.config.guild(guild).all()
botcount = guild_data["bot_count"]
onlinecount = guild_data["online_count"]
# Gets count of bots
bots = lambda x: x.bot
num = len([m for m in guild.members if bots(m)])
bot_msg = f"Bots: {num}"
# Gets count of online users
members = guild.member_count
offline = len(list(filter(lambda m: m.status is discord.Status.offline, guild.members)))
num = members - offline
online_msg = f"Online: {num}"
# Gets count of actual users
total = lambda x: not x.bot
num = len([m for m in guild.members if total(m)])
human_msg = f"Total Humans: {num}"
channel_id = guild_data["channel_id"] channel_id = guild_data["channel_id"]
if channel_id is None: if channel_id is None:
return return
botchannel_id = guild_data["botchannel_id"]
onlinechannel_id = guild_data["onlinechannel_id"]
channel_id = guild_data["channel_id"]
channel: discord.VoiceChannel = guild.get_channel(channel_id) channel: discord.VoiceChannel = guild.get_channel(channel_id)
botchannel: discord.VoiceChannel = guild.get_channel(botchannel_id)
onlinechannel: discord.VoiceChannel = guild.get_channel(onlinechannel_id)
if channel is None:
return
name = ""
if guild_data["member_count"]: if guild_data["member_count"]:
name += "Members: {} ".format(guild.member_count) name = "{} ".format(human_msg)
if name == "":
name = "Stats not enabled"
await channel.edit(reason="InfoChannel update", name=name) await channel.edit(reason="InfoChannel update", name=name)
if botcount:
name = "{} ".format(bot_msg)
await botchannel.edit(reason="InfoChannel update", name=name)
if onlinecount:
name = "{} ".format(online_msg)
await onlinechannel.edit(reason="InfoChannel update", name=name)
@listener() @listener()
async def on_member_join(self, member: discord.Member): async def on_member_join(self, member: discord.Member):
await self.update_infochannel(member.guild) await self.update_infochannel(member.guild)
@ -118,3 +206,10 @@ class InfoChannel(Cog):
@listener() @listener()
async def on_member_remove(self, member: discord.Member): async def on_member_remove(self, member: discord.Member):
await self.update_infochannel(member.guild) await self.update_infochannel(member.guild)
@listener()
async def on_member_update(self, before: discord.Member, after: discord.Member):
onlinecount = await self.config.guild(after.guild).online_count()
if onlinecount:
if before.status != after.status:
await self.update_infochannel(after.guild)

Loading…
Cancel
Save