diff --git a/README.md b/README.md
index 47a5a22..798b52b 100644
--- a/README.md
+++ b/README.md
@@ -11,6 +11,7 @@ Cog Function
| hangman | **Alpha** | Play a game of hangman
Some visual glitches and needs more customization |
| howdoi | **Incomplete** | Create temporary marks on users that expire after specified time
Not yet ported to v3 |
| leaver | **Incomplete** | Send a message in a channel when a user leaves the server
Not yet ported to v3 |
+| lseen | **Alpha** | Track when a member was last online
Alpha release, please report bugs |
| reactrestrict | **Alpha** | Removes reactions by role per channel
A bit clunky, but functional |
| secrethitler | **Incomplete** | Play the Secret Hitler game
Concept, no work done yet |
| stealemoji | **Alpha** | Steals any custom emoji it sees in a reaction
Some planned upgrades for server generation |
diff --git a/lseen/__init__.py b/lseen/__init__.py
new file mode 100644
index 0000000..716f34d
--- /dev/null
+++ b/lseen/__init__.py
@@ -0,0 +1,5 @@
+from .lseen import LastSeen
+
+
+def setup(bot):
+ bot.add_cog(LastSeen(bot))
diff --git a/lseen/lseen.py b/lseen/lseen.py
new file mode 100644
index 0000000..c4c0c42
--- /dev/null
+++ b/lseen/lseen.py
@@ -0,0 +1,92 @@
+from datetime import datetime
+
+import dateutil.parser
+import discord
+from discord.ext import commands
+from redbot.core import Config, RedContext
+from redbot.core.bot import Red
+
+
+class LastSeen:
+ """
+ V3 Cog Template
+ """
+
+ online_status = discord.Status.online
+
+ offline_status = discord.Status.offline
+
+ def __init__(self, bot: Red):
+ self.bot = bot
+ self.config = Config.get_conf(self, identifier=9811198108111121, force_registration=True)
+ default_global = {}
+ default_guild = {
+ "enabled": True
+ }
+ default_member = {
+ "seen": None
+ }
+
+ self.config.register_global(**default_global)
+ self.config.register_guild(**default_guild)
+ self.config.register_member(**default_member)
+
+ @staticmethod
+ def get_date_time(s):
+ d = dateutil.parser.parse(s)
+ return d
+
+ @commands.group(aliases=['setlseen'], name='lseenset')
+ async def lset(self, ctx: RedContext):
+ """Change settings for lseen"""
+ if ctx.invoked_subcommand is None:
+ await ctx.send_help()
+
+ @lset.command(name="toggle")
+ async def lset_toggle(self, ctx: RedContext):
+ """Toggles tracking seen for this server"""
+ enabled = not await self.config.guild(ctx.guild).enabled()
+ await self.config.guild(ctx.guild).enabled.set(
+ enabled)
+
+ await ctx.send(
+ "Seen for this server is now {}".format(
+ "Enabled" if enabled else "Disabled"))
+
+ @commands.command(aliases=['lastseen'])
+ async def lseen(self, ctx: RedContext, member: discord.Member):
+ """
+ Just says the time the user was last seen
+
+ :param member:
+ """
+
+ if member.status != self.offline_status:
+ last_seen = datetime.utcnow()
+ else:
+ last_seen = await self.config.member(member).seen()
+ if last_seen is None:
+ await ctx.send(embed=discord.Embed(description="I've never seen this user"))
+ return
+ last_seen = self.get_date_time(last_seen)
+
+ # embed = discord.Embed(
+ # description="{} was last seen at this date and time".format(member.display_name),
+ # timestamp=self.get_date_time(last_seen))
+
+ embed = discord.Embed(timestamp=last_seen)
+ await ctx.send(embed=embed)
+
+ # async def on_socket_raw_receive(self, data):
+ # try:
+ # if type(data) == str:
+ # raw = json.loads(data)
+ # print(data)
+ # except:
+ # print(data)
+
+ async def on_member_update(self, before: discord.Member, after: discord.Member):
+ if before.status != self.offline_status and after.status == self.offline_status:
+ if not await self.config.guild(before.guild).enabled():
+ return
+ await self.config.member(before).seen.set(datetime.utcnow().isoformat())