Skip to content

Commit

Permalink
🌿 Optimize and consolidate code for Grass and TwoTripleThree
Browse files Browse the repository at this point in the history
  • Loading branch information
database64128 committed Mar 20, 2024
1 parent b47e661 commit 8301a97
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 40 deletions.
47 changes: 29 additions & 18 deletions CubicBot.Telegram/Stats/Grass.cs
Original file line number Diff line number Diff line change
@@ -1,34 +1,45 @@
using CubicBot.Telegram.Utils;
using System.Linq;
using System.Numerics;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;

namespace CubicBot.Telegram.Stats;

public sealed class Grass : IStatsCollector
public sealed partial class Grass : IStatsCollector
{
private static readonly string[] s_grassSeeds =
[
"cao", "艹", "草", "c奥", "c嗷",
];
[GeneratedRegex("(cao|c奥|c嗷|艹|草)")]
private static partial Regex GrassSeedsRegex();

private static bool IsGrowingGrass(string msg) => msg.Length > 0 && s_grassSeeds.Any(msg.Contains);
private static bool IsGrowingGrass(string msg) => GrassSeedsRegex().IsMatch(msg);

public Task CollectAsync(MessageContext messageContext, CancellationToken cancellationToken = default)
{
if (IsGrowingGrass(messageContext.Text))
{
var grassGrown = messageContext.MemberOrUserData.GrassGrown;
grassGrown++;
messageContext.MemberOrUserData.GrassGrown = grassGrown;
if (!IsGrowingGrass(messageContext.Text))
return Task.CompletedTask;

var grassGrown = messageContext.MemberOrUserData.GrassGrown;
grassGrown++;
messageContext.MemberOrUserData.GrassGrown = grassGrown;

if (messageContext.GroupData is GroupData groupData)
groupData.GrassGrown++;
if (messageContext.GroupData is GroupData groupData)
groupData.GrassGrown++;

if ((grassGrown & (grassGrown - 1UL)) == 0UL && grassGrown > 4UL) // 8, 16, 32...
return messageContext.ReplyWithTextMessageAndRetryAsync($"🏆 Achievement Unlocked: {grassGrown} Grass Grown", cancellationToken: cancellationToken);
}
// Assign achievement on 8, 16, 32...
if (!BitOperations.IsPow2(grassGrown) || grassGrown <= 4UL)
return Task.CompletedTask;

return Task.CompletedTask;
const string msgPrefix = "🏆 Achievement Unlocked: ";
const string herb = "🌿";
var herbCount = BitOperations.TrailingZeroCount(grassGrown);
var msg = string.Create(msgPrefix.Length + herb.Length * herbCount, herbCount, (buf, _) =>
{
msgPrefix.CopyTo(buf);
for (var i = msgPrefix.Length; i < buf.Length; i += herb.Length)
{
herb.CopyTo(buf[i..]);
}
});
return messageContext.ReplyWithTextMessageAndRetryAsync(msg, cancellationToken: cancellationToken);
}
}
43 changes: 21 additions & 22 deletions CubicBot.Telegram/Stats/TwoTripleThree.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,31 +23,30 @@ public sealed partial class TwoTripleThree : IStatsCollector

public Task CollectAsync(MessageContext messageContext, CancellationToken cancellationToken = default)
{
if (ContainsTwoDoubleThree(messageContext.Text))
{
var twoTripleThreesUsed = messageContext.MemberOrUserData.TwoTripleThreesUsed;
twoTripleThreesUsed++;
messageContext.MemberOrUserData.TwoTripleThreesUsed = twoTripleThreesUsed;
if (!ContainsTwoDoubleThree(messageContext.Text))
return Task.CompletedTask;

var twoTripleThreesUsed = messageContext.MemberOrUserData.TwoTripleThreesUsed;
twoTripleThreesUsed++;
messageContext.MemberOrUserData.TwoTripleThreesUsed = twoTripleThreesUsed;

if (messageContext.GroupData is GroupData groupData)
groupData.TwoTripleThreesUsed++;

if (messageContext.GroupData is GroupData groupData)
groupData.TwoTripleThreesUsed++;
// Assign achievement on 8, 16, 32...
if (!BitOperations.IsPow2(twoTripleThreesUsed) || twoTripleThreesUsed <= 4UL)
return Task.CompletedTask;

if ((twoTripleThreesUsed & (twoTripleThreesUsed - 1UL)) == 0UL && twoTripleThreesUsed > 4UL) // 8, 16, 32...
const string msgPrefix = "🏆 Achievement Unlocked: 2";
var threes = BitOperations.TrailingZeroCount(twoTripleThreesUsed);
var msg = string.Create(msgPrefix.Length + threes, threes, (buf, _) =>
{
msgPrefix.CopyTo(buf);
for (var i = msgPrefix.Length; i < buf.Length; i++)
{
const string msgPrefix = "🏆 Achievement Unlocked: 2";
var threes = BitOperations.Log2(twoTripleThreesUsed);
var msg = string.Create(msgPrefix.Length + threes, threes, (buf, _) =>
{
msgPrefix.CopyTo(buf);
for (var i = msgPrefix.Length; i < buf.Length; i++)
{
buf[i] = '3';
}
});
return messageContext.ReplyWithTextMessageAndRetryAsync(msg, cancellationToken: cancellationToken);
buf[i] = '3';
}
}

return Task.CompletedTask;
});
return messageContext.ReplyWithTextMessageAndRetryAsync(msg, cancellationToken: cancellationToken);
}
}

0 comments on commit 8301a97

Please sign in to comment.