public async Task OnLoginRequest(BanchoLoginRequestArgs args) { try { var sw = new Stopwatch(); sw.Start(); var loginData = LoginParser.ParseLogin(args.Reader); if (loginData == null) { Exception(args.Writer); return; } var cacheKey = $"sora:user:{loginData.GetHashCode()}"; if (!_cache.TryGet(cacheKey, out Presence presence)) { var dbUser = await DbUser.GetDbUser(_ctx, loginData.Username); if (dbUser == null) { LoginFailed(args.Writer); return; } if (!dbUser.IsPassword(loginData.Password)) { _logger.Log(LogLevel.Warning, $"{LCOL.RED}{dbUser.UserName} " + $"{LCOL.PURPLE}({dbUser.Id}) " + $"{LCOL.RED}Failed {LCOL.WHITE}to Login!"); LoginFailed(args.Writer); return; } if (args.IpAddress != "127.0.0.1" && args.IpAddress != "0.0.0.0") { try { var data = Localisation.GetData(args.IpAddress); args.Pr.Info.Longitude = data.Location.Longitude ?? 0; args.Pr.Info.Latitude = data.Location.Latitude ?? 0; args.Pr.Info.CountryId = Localisation.StringToCountryId(data.Country.IsoCode); } catch { // Ignored.. doesn't matter too much } } args.Pr.User = dbUser; args.Pr.Info.TimeZone = (byte)loginData.Timezone; var lb = await DbLeaderboard.GetLeaderboardAsync(_ctx, dbUser); args.Pr["LB"] = lb; args.Pr.Stats.TotalScore = lb.TotalScoreOsu; args.Pr.Stats.RankedScore = lb.RankedScoreOsu; args.Pr.Stats.PerformancePoints = (ushort)lb.PerformancePointsOsu; args.Pr.Stats.PlayCount = (uint)lb.PlayCountOsu; args.Pr.Stats.Accuracy = (float)lb.GetAccuracy(_ctx, PlayMode.Osu); args.Pr.Stats.Position = lb.GetPosition(_ctx, PlayMode.Osu); //args.pr["BLOCK_NON_FRIENDS_DM"] = loginData.BlockNonFriendDMs; _cache.Set(cacheKey, args.Pr, TimeSpan.FromMinutes(30)); } else { var t = args.Pr.Token; args.Pr = presence; args.Pr.Token = t; } if (_pcs.TryGet(args.Pr.User.Id, out var oldPresence)) { oldPresence.ActiveMatch?.Leave(args.Pr); oldPresence.Spectator?.Leave(args.Pr); _pcs.Leave(oldPresence); } _pcs.Join(args.Pr); Success(args.Writer, args.Pr.User.Id); args.Pr.Push(new ProtocolNegotiation()); args.Pr.Push(new UserPresence(args.Pr)); args.Pr.Push(new HandleUpdate(args.Pr)); args.Pr.Info.ClientPermission = LoginPermissions.User; if (args.Pr.User.Permissions == Permission.GROUP_DONATOR) { args.Pr.Info.ClientPermission |= LoginPermissions.Supporter; } if (args.Pr.User.Permissions == Permission.GROUP_ADMIN) { args.Pr.Info.ClientPermission |= LoginPermissions.BAT | LoginPermissions.Administrator | LoginPermissions.Moderator; } if (args.Pr.User.Permissions == Permission.GROUP_DEVELOPER) { args.Pr.Info.ClientPermission |= LoginPermissions.Developer; } if (!args.Pr.User.Permissions.HasPermission(Permission.GROUP_DONATOR)) { if (_cfg.Server.FreeDirect) { args.Pr.Push(new LoginPermission(LoginPermissions.User | LoginPermissions.Supporter | args.Pr.Info.ClientPermission)); } } else { args.Pr.Push(new LoginPermission(args.Pr.Info.ClientPermission)); } args.Pr.Push(new FriendsList(DbFriend.GetFriends(_ctx, args.Pr.User.Id).ToList())); args.Pr.Push(new PresenceBundle(_pcs.GetUserIds(args.Pr).ToList())); foreach (var chanAuto in _cs.ChannelsAutoJoin) { if ((chanAuto.Status & ChannelStatus.AdminOnly) != 0 && args.Pr.User.Permissions == Permission.ADMIN_CHANNEL) { args.Pr.Push(new ChannelAvailableAutojoin(chanAuto)); } else if ((chanAuto.Status & ChannelStatus.AdminOnly) == 0) { args.Pr.Push(new ChannelAvailableAutojoin(chanAuto)); } args.Pr.Push(new ChannelJoinSuccess(chanAuto)); chanAuto.Join(args.Pr); } foreach (var channel in _cs.Channels) { if ((channel.Status & ChannelStatus.AdminOnly) != 0 && args.Pr.User.Permissions == Permission.ADMIN_CHANNEL) { args.Pr.Push(new ChannelAvailable(channel)); } else if ((channel.Status & ChannelStatus.AdminOnly) == 0) { args.Pr.Push(new ChannelAvailable(channel)); } } _pcs.Push(new PresenceSingle(args.Pr.User.Id)); _pcs.Join(args.Pr); args.Pr.WritePackets(args.Writer.BaseStream); sw.Stop(); _logger.Log(LogLevel.Debug, "Login Time:\nMS: ", sw.Elapsed.TotalMilliseconds); _logger.Log(LogLevel.Information, $"{LCOL.RED}{args.Pr.User.UserName} {LCOL.PURPLE}( {args.Pr.User.Id} ) {LCOL.WHITE}has logged in!" ); args.Pr["LAST_PONG"] = DateTime.Now; } catch (Exception ex) { Logger.Err(ex); Exception(args.Writer); } }
public void SomeLoginHandler(BanchoLoginRequestArgs args) { args.Writer.Write(new LoginResponse((LoginResponses)101)); args.Writer.Write(new Announce("Hello World!")); }
public void OnLoginRequest(BanchoLoginRequestArgs args) { try { var sw = new Stopwatch(); sw.Start(); var loginData = LoginParser.ParseLogin(args.Reader); if (loginData == null) { Exception(args.Writer); return; } var cacheKey = $"sora:user:{loginData.GetHashCode()}"; var presence = _cache.Get <Presence>(cacheKey); if (presence == null) { var user = Users.GetUser(_factory, loginData.Username); if (user == null) { LoginFailed(args.Writer); return; } if (!user.IsPassword(loginData.Password)) { LoginFailed(args.Writer); return; } if (args.IPAddress != "127.0.0.1" && args.IPAddress != "0.0.0.0") { var data = Localisation.GetData(args.IPAddress); args.pr.CountryId = Localisation.StringToCountryId(data.Country.IsoCode); args.pr.Lon = data.Location.Longitude ?? 0; args.pr.Lat = data.Location.Latitude ?? 0; } args.pr.User = user; args.pr.LeaderboardRx = LeaderboardRx.GetLeaderboard(_factory, args.pr.User); args.pr.LeaderboardStd = LeaderboardStd.GetLeaderboard(_factory, args.pr.User); args.pr.Rank = args.pr.LeaderboardStd.GetPosition(_factory, PlayMode.Osu); args.pr.Timezone = loginData.Timezone; args.pr.BlockNonFriendDm = loginData.BlockNonFriendDMs; args.pr.Status.BeatmapId = 0; args.pr.Status.StatusText = ""; args.pr.Status.CurrentMods = 0; args.pr.Status.BeatmapChecksum = ""; args.pr.Status.Playmode = PlayMode.Osu; args.pr.Status.Status = Status.Idle; args.pr.Rank = args.pr.LeaderboardStd.GetPosition(_factory, PlayMode.Osu); _cache.Set(cacheKey, args.pr, TimeSpan.FromMinutes(30)); } else { var t = args.pr.Token; args.pr = presence; args.pr.Token = t; } _pcs += args.pr; Success(args.Writer, args.pr.User.Id); args.pr += new ProtocolNegotiation(); args.pr += new UserPresence(args.pr); args.pr += new HandleUpdate(args.pr); if ((args.pr.ClientPermissions & LoginPermissions.Supporter) == 0) { if (_cfg.Server.FreeDirect) { args.pr += new LoginPermission(LoginPermissions.User | LoginPermissions.Supporter); } } else { args.pr += new LoginPermission(args.pr.ClientPermissions); } args.pr += new FriendsList(Database.Models.Friends.GetFriends(_factory, args.pr.User.Id).ToList()); args.pr += new PresenceBundle(_pcs.GetUserIds(args.pr).ToList()); foreach (var opr in _pcs.AllPresences) { args.pr += new PresenceSingle(opr.User.Id); args.pr += new UserPresence(opr); args.pr += new HandleUpdate(opr); } foreach (var chanAuto in _cs.ChannelsAutoJoin) { if (chanAuto.AdminOnly && args.pr.User.Permissions == Permission.ADMIN_CHANNEL) { args.pr += new ChannelAvailableAutojoin(chanAuto); } else if (!chanAuto.AdminOnly) { args.pr += new ChannelAvailableAutojoin(chanAuto); } if (chanAuto.JoinChannel(args.pr)) { args.pr += new ChannelJoinSuccess(chanAuto); } else { args.pr += new ChannelRevoked(chanAuto); } } foreach ((string _, Channel value) in _cs.Channels) { if (value.AdminOnly && args.pr.User.Permissions == Permission.ADMIN_CHANNEL) { args.pr += new ChannelAvailable(value); } else if (!value.AdminOnly) { args.pr += new ChannelAvailable(value); } } var stream = _ps.GetStream("main"); if (stream == null) { Exception(args.Writer); return; } stream.Broadcast(new PresenceSingle(args.pr.User.Id)); stream.Broadcast(new UserPresence(args.pr)); stream.Broadcast(new HandleUpdate(args.pr)); stream.Join(args.pr); args.pr .GetOutput() .WriteTo(args.Writer.BaseStream); sw.Stop(); Logger.Info("MS: ", sw.Elapsed.TotalMilliseconds); Logger.Info( "%#F94848%" + args.pr.User.Username, "%#B342F4%(", args.pr.User.Id, "%#B342F4%) %#FFFFFF%has logged in!" ); } catch (Exception ex) { Logger.Err(ex); Exception(args.Writer); } }