public void OnClientDisconnected(AsyncTCPLib.OnClientDisconnectedEventArgs <AsyncTCPLib.VirtualClient> e) { Association.Carrier userCarrier = this._associations[e.Client.Id]; if (userCarrier != null) { long accountId = Program.GetInstance().Server.Clients[e.Client.Id].Data.AuthenticationInfo.Id; if (userCarrier.Command == Socks.Constants.Command.Connect) { Association.ConnectProxy proxy = (Association.ConnectProxy)userCarrier.Data; Commit.Info info = new Commit.Info(accountId); if (userCarrier.WiredTx > 0 || userCarrier.WiredRx > 0) { info.Stats = new Commit.Stats(userCarrier.WiredTx, userCarrier.WiredRx); } info.Command = new Commit.Command( userCarrier.Command, e.Client.RemoteEndPoint, proxy.Client.RemoteEndPoint, userCarrier.WiredTx, userCarrier.WiredRx, userCarrier.CommandTime, userCarrier.CommandSuccess ); this._plugin.CommitInfo(info); } this._associations[e.Client.Id] = null; } }
public void CommitInfo(Commit.Info info) { this._commitReset.WaitOne(); this._commitReset.Reset(); this._commitInfo.Add(info); this._commitReset.Set(); }
private async void _processCommits() { while (true) { this._commitReset.WaitOne(); this._commitReset.Reset(); if (this._commitInfo.Count > 0) { Program programInstance = Program.GetInstance(); Plugin.IDatabaseConnection connection = await programInstance.Database.GetConnection(); using (Plugin.IDatabaseTransaction transaction = connection.OpenTransaction()) { programInstance.Log.DebugFormat("Processing commit info, {0} commits", this._commitInfo.Count); int totalQueries = 0; for (int i = this._commitInfo.Count - 1; i >= 0; i--) { Commit.Info info = this._commitInfo[i]; if (info.Stats.HasValue) { await programInstance.Database.CommitStats(connection, info.AccountId, info.Stats.Value.WiredTx, info.Stats.Value.WiredRx); totalQueries++; } if (info.Command.HasValue) { await programInstance.Database.CommitCommand(connection, info.AccountId, info.Command.Value.SocksCommand, info.Command.Value.ClientEndPoint, info.Command.Value.ProxyEndPoint, info.Command.Value.WiredTx, info.Command.Value.WiredRx, info.Command.Value.CommandTime, info.Command.Value.Success); totalQueries++; } programInstance.Log.DebugFormat("Pci > stats: {0}, command: {1} for {2}", info.Stats.HasValue, info.Command.HasValue, info.AccountId); this._commitInfo.RemoveAt(i); } programInstance.Log.DebugFormat("Processing commit info, commiting {0} queries to database impl", totalQueries); transaction.Commit(); } connection.IsBusy = false; } this._commitReset.Set(); Thread.Sleep(2500); // process all 2.5 seconds } }