Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion csharp/Platform.Bot/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ private static async Task<int> Main(string[] args)
var minimumInteractionIntervalOption = new Option<int>(
name: "--minimum-interaction-interval",
description: "Minimum interaction interval in seconds.",
getDefaultValue: () => 60);
getDefaultValue: () => 300);

var rootCommand = new RootCommand("Sample app for System.CommandLine")
{
Expand Down
20 changes: 20 additions & 0 deletions csharp/Platform.Bot/Trackers/IssueTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,14 @@ public class IssueTracker : ITracker<Issue>
/// </summary>
private IList<ITrigger<Issue>> _triggers { get; }

/// <summary>
/// <para>
/// Tracks processed issues to prevent duplicate actions.
/// </para>
/// <para></para>
/// </summary>
private HashSet<string> _processedIssues { get; } = new HashSet<string>();

/// <summary>
/// <para>
/// Initializes a new <see cref="IssueTracker"/> instance.
Expand Down Expand Up @@ -66,6 +74,15 @@ public async Task Start(CancellationToken cancellationToken)
var allIssues = _storage.GetIssues();
foreach (var issue in allIssues)
{
// Create a unique key for each issue-trigger combination to prevent duplicate processing
var issueKey = $"{issue.Repository.FullName}#{issue.Number}";

// Skip if this issue has already been processed
if (_processedIssues.Contains(issueKey))
{
continue;
}

foreach (var trigger in _triggers)
{
if (cancellationToken.IsCancellationRequested)
Expand All @@ -75,6 +92,9 @@ public async Task Start(CancellationToken cancellationToken)
if (await trigger.Condition(issue))
{
await trigger.Action(issue);
// Mark issue as processed after successful action
_processedIssues.Add(issueKey);
break; // Only process one trigger per issue to prevent conflicts
}
}
}
Expand Down
20 changes: 20 additions & 0 deletions csharp/Platform.Bot/Trackers/PullRequestTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,14 @@ public class PullRequestTracker : ITracker<PullRequest>
/// </summary>
private IList<ITrigger<PullRequest>> _triggers;

/// <summary>
/// <para>
/// Tracks processed pull requests to prevent duplicate actions.
/// </para>
/// <para></para>
/// </summary>
private HashSet<string> _processedPullRequests = new HashSet<string>();

/// <summary>
/// <para>
/// Initializes a new <see cref="IssueTracker"/> instance.
Expand Down Expand Up @@ -75,10 +83,22 @@ public async Task Start(CancellationToken cancellationToken)
{
return;
}

// Create a unique key for each pull request to prevent duplicate processing
var pullRequestKey = $"{repository.FullName}#{pullRequest.Number}";

// Skip if this pull request has already been processed
if (_processedPullRequests.Contains(pullRequestKey))
{
continue;
}

var detailedPullRequest = _storage.Client.PullRequest.Get(repository.Id, pullRequest.Number).AwaitResult();
if (await trigger.Condition(detailedPullRequest))
{
await trigger.Action(detailedPullRequest);
// Mark pull request as processed after successful action
_processedPullRequests.Add(pullRequestKey);
}
}
}
Expand Down
15 changes: 12 additions & 3 deletions csharp/Storage/RemoteStorage/GitHubStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,12 +103,21 @@ public IReadOnlyList<Issue> GetIssues()
Since = lastIssue
};
var issues = Client.Issue.GetAllForCurrent(request).Result;

// Always update lastIssue to current time to prevent reprocessing the same timeframe
// even when there are no new issues
var now = DateTimeOffset.Now;
if (issues.Count != 0)
{
lastIssue = issues.Max(x => x.CreatedAt);
return issues;
var maxIssueTime = issues.Max(x => x.CreatedAt);
lastIssue = maxIssueTime > now ? maxIssueTime : now;
}
return new List<Issue>();
else
{
lastIssue = now;
}

return issues;
}

public Task<IReadOnlyList<GitHubCommit>> GetCommits(long repositoryId, CommitRequest commitRequest) => Client.Repository.Commit.GetAll(repositoryId, commitRequest);
Expand Down
Loading