public void refresh() { fetchFollowed(); fetchUnfollowed(); fetchGroups(); last_refresh = TimestampHandler.GetTimeStamp16(DateTime.Now); }
public bool sendMessage(JObject job) { //https://api.vc.bilibili.com/web_im/v1/web_im/send_msg Dictionary <string, string> kvs = new Dictionary <string, string>(); CookieCollection ck = sess.CookieContext; kvs.Add("msg[sender_uid]", ck["DedeUserID"].Value); kvs.Add("msg[receiver_id]", talker_id.ToString()); kvs.Add("msg[receiver_type]", "1"); kvs.Add("msg[msg_type]", "2"); kvs.Add("msg[msg_status]", "0"); kvs.Add("msg[content]", job.ToString()); kvs.Add("msg[new_face_version]", "0"); kvs.Add("msg[timestamp]", TimestampHandler.GetTimeStamp(DateTime.Now).ToString()); kvs.Add("msg[dev_id]", "A8DF21F2-98F7-43A6-9EB4-E348F9B41EBC");//暂时不知道如何生成,但该项似乎不影响私信的发送 kvs.Add("build", "0"); kvs.Add("mobi_app", "web"); kvs.Add("csrf_token", ck["bili_jct"].Value); kvs.Add("from_firework", "0"); kvs.Add("csrf", ck["bili_jct"].Value); string response = sess._post_with_cookies("https://api.vc.bilibili.com/web_im/v1/web_im/send_msg", kvs); if (response == "") { return(false); } JObject raw_json = (JObject)JsonConvert.DeserializeObject(response); return(raw_json.Value <int>("code") == 0); }
public void SetUp() { handler = new TimestampHandler() { InnerHandler = new TestHandler() }; client = new HttpClient(handler); }
public void updateSessions() { sess._get_with_cookies("https://api.vc.bilibili.com/session_svr/v1/session_svr/new_sessions?begin_ts=" + last_refresh + "&build=0&mobi_app=web"); string rtv = sess._get_with_cookies("https://api.vc.bilibili.com/session_svr/v1/session_svr/ack_sessions?begin_ts=" + last_refresh + "&build=0&mobi_app=web"); lastjson = rtv; JObject raw_json = (JObject)JsonConvert.DeserializeObject(rtv); if (raw_json.Value <int>("code") != 0) {//发生错误 throw new ApiRemoteException(raw_json); } List <PrivMessageSession> sessionlist = new List <PrivMessageSession>(); foreach (JToken jobj in raw_json["data"]["session_list"]) { PrivMessageSession session = new PrivMessageSession(jobj, sess); if (session.followed) { if (!followed_sessions.Contains(session)) { followed_sessions.Add(session); } else { followed_sessions[followed_sessions.IndexOf(session)].updateFromJson(jobj); } } else if (!session.isGroup) { if (!unfollowed_sessions.Contains(session)) { unfollowed_sessions.Add(session); } else { unfollowed_sessions[unfollowed_sessions.IndexOf(session)].updateFromJson(jobj); } } else { if (!group_sessions.Contains(session)) { group_sessions.Add(session); } else { group_sessions[group_sessions.IndexOf(session)].updateFromJson(jobj); } } } last_refresh = TimestampHandler.GetTimeStamp16(DateTime.Now); }
private static void Receiver_ReceivedDanmaku(object sender, ReceivedDanmakuArgs e) { var d = e.Danmaku; string guid = ""; switch (d.MsgType) { case MsgTypeEnum.GuardBuy: guid = Guid.NewGuid().ToString("N"); db.logCREW(d.UserID, d.UserGuardLevel, d.GiftCount, TimestampHandler.GetTimeStamp(DateTime.Now), guid); break; case MsgTypeEnum.LiveEnd: lid = -1; break; } db.logDMK(TimestampHandler.GetTimeStamp16(DateTime.Now), d.RawData, lid, guid); }
private static void StreamStarted(object sender, StreamStartedArgs e) { lid = TimestampHandler.GetTimeStamp(DateTime.Now); }
async IAsyncEnumerator <PgOutputReplicationMessage> StartReplicationInternal(CancellationToken cancellationToken) { var stream = _connection.StartLogicalReplication( _slot, cancellationToken, _walLocation, _options.GetOptionPairs(), bypassingStream: true); var buf = _connection.Connector !.ReadBuffer; await foreach (var xLogData in stream.WithCancellation(cancellationToken)) { await buf.EnsureAsync(1); var messageCode = (BackendReplicationMessageCode)buf.ReadByte(); switch (messageCode) { case BackendReplicationMessageCode.Begin: { await buf.EnsureAsync(20); yield return(_beginMessage.Populate( xLogData.WalStart, xLogData.WalEnd, xLogData.ServerClock, new NpgsqlLogSequenceNumber(buf.ReadUInt64()), TimestampHandler.FromPostgresTimestamp(buf.ReadInt64()), buf.ReadUInt32() )); continue; } case BackendReplicationMessageCode.Commit: { await buf.EnsureAsync(25); yield return(_commitMessage.Populate( xLogData.WalStart, xLogData.WalEnd, xLogData.ServerClock, buf.ReadByte(), new NpgsqlLogSequenceNumber(buf.ReadUInt64()), new NpgsqlLogSequenceNumber(buf.ReadUInt64()), TimestampHandler.FromPostgresTimestamp(buf.ReadInt64()) )); continue; } case BackendReplicationMessageCode.Origin: { await buf.EnsureAsync(9); yield return(_originMessage.Populate( xLogData.WalStart, xLogData.WalEnd, xLogData.ServerClock, new NpgsqlLogSequenceNumber(buf.ReadUInt64()), await buf.ReadNullTerminatedString(async: true, cancellationToken))); continue; } case BackendReplicationMessageCode.Relation: { await buf.EnsureAsync(6); var relationId = buf.ReadUInt32(); var ns = await buf.ReadNullTerminatedString(async : true, cancellationToken); var relationName = await buf.ReadNullTerminatedString(async : true, cancellationToken); await buf.EnsureAsync(3); var relationReplicaIdentitySetting = (char)buf.ReadByte(); var numColumns = buf.ReadUInt16(); if (numColumns > _relationalMessageColumns.Length) { _relationalMessageColumns = new RelationMessage.Column[numColumns]; } for (var i = 0; i < numColumns; i++) { await buf.EnsureAsync(2); var flags = buf.ReadByte(); var columnName = await buf.ReadNullTerminatedString(async : true, cancellationToken); await buf.EnsureAsync(8); var dateTypeId = buf.ReadUInt32(); var typeModifier = buf.ReadInt32(); _relationalMessageColumns[i] = new RelationMessage.Column(flags, columnName, dateTypeId, typeModifier); } yield return(_relationMessage.Populate( xLogData.WalStart, xLogData.WalEnd, xLogData.ServerClock, relationId, ns, relationName, relationReplicaIdentitySetting, new ReadOnlyMemory <RelationMessage.Column>(_relationalMessageColumns, 0, numColumns) )); continue; } case BackendReplicationMessageCode.Type: { await buf.EnsureAsync(5); var typeId = buf.ReadUInt32(); var ns = await buf.ReadNullTerminatedString(async : true, cancellationToken); var name = await buf.ReadNullTerminatedString(async : true, cancellationToken); yield return(_typeMessage.Populate(xLogData.WalStart, xLogData.WalEnd, xLogData.ServerClock, typeId, ns, name)); continue; } case BackendReplicationMessageCode.Insert: { await buf.EnsureAsync(7); var relationId = buf.ReadUInt32(); var tupleDataType = (TupleType)buf.ReadByte(); Debug.Assert(tupleDataType == TupleType.NewTuple); var numColumns = buf.ReadUInt16(); var newRow = await ReadTupleDataAsync(ref _tupleDataArray1, numColumns); yield return(_insertMessage.Populate(xLogData.WalStart, xLogData.WalEnd, xLogData.ServerClock, relationId, newRow)); continue; } case BackendReplicationMessageCode.Update: { await buf.EnsureAsync(7); var relationId = buf.ReadUInt32(); var tupleType = (TupleType)buf.ReadByte(); var numColumns = buf.ReadUInt16(); switch (tupleType) { case TupleType.Key: var keyRow = await ReadTupleDataAsync(ref _tupleDataArray1, numColumns); await buf.EnsureAsync(3); tupleType = (TupleType)buf.ReadByte(); Debug.Assert(tupleType == TupleType.NewTuple); numColumns = buf.ReadUInt16(); var newRow = await ReadTupleDataAsync(ref _tupleDataArray2, numColumns); yield return(_indexUpdateMessage.Populate(xLogData.WalStart, xLogData.WalEnd, xLogData.ServerClock, relationId, newRow, keyRow)); continue; case TupleType.OldTuple: var oldRow = await ReadTupleDataAsync(ref _tupleDataArray1, numColumns); await buf.EnsureAsync(3); tupleType = (TupleType)buf.ReadByte(); Debug.Assert(tupleType == TupleType.NewTuple); numColumns = buf.ReadUInt16(); newRow = await ReadTupleDataAsync(ref _tupleDataArray2, numColumns); yield return(_fullUpdateMessage.Populate(xLogData.WalStart, xLogData.WalEnd, xLogData.ServerClock, relationId, newRow, oldRow)); continue; case TupleType.NewTuple: newRow = await ReadTupleDataAsync(ref _tupleDataArray1, numColumns); yield return(_updateMessage.Populate(xLogData.WalStart, xLogData.WalEnd, xLogData.ServerClock, relationId, newRow)); continue; default: throw new NotSupportedException($"The tuple type '{tupleType}' is not supported."); } } case BackendReplicationMessageCode.Delete: { await buf.EnsureAsync(7); var relationId = buf.ReadUInt32(); var tupleDataType = (TupleType)buf.ReadByte(); var numColumns = buf.ReadUInt16(); switch (tupleDataType) { case TupleType.Key: yield return(_keyDeleteMessage.Populate(xLogData.WalStart, xLogData.WalEnd, xLogData.ServerClock, relationId, await ReadTupleDataAsync(ref _tupleDataArray1, numColumns))); continue; case TupleType.OldTuple: yield return(_fullDeleteMessage.Populate(xLogData.WalStart, xLogData.WalEnd, xLogData.ServerClock, relationId, await ReadTupleDataAsync(ref _tupleDataArray1, numColumns))); continue; default: throw new NotSupportedException($"The tuple type '{tupleDataType}' is not supported."); } } case BackendReplicationMessageCode.Truncate: { await buf.EnsureAsync(9); // Don't dare to truncate more than 2147483647 tables at once! var numRels = checked ((int)buf.ReadUInt32()); var truncateOptions = (TruncateOptions)buf.ReadByte(); var relationIds = new uint[numRels]; await buf.EnsureAsync(checked (numRels * 4)); for (var i = 0; i < numRels; i++) { relationIds[i] = buf.ReadUInt32(); } yield return(_truncateMessage.Populate( xLogData.WalStart, xLogData.WalEnd, xLogData.ServerClock, truncateOptions, relationIds)); continue; } default: throw new NotSupportedException( $"Invalid message code {messageCode} in Logical Replication Protocol."); } } // We never get here - the above is an endless loop that terminates only with a cancellation exception ValueTask <ReadOnlyMemory <TupleData> > ReadTupleDataAsync(ref TupleData[] array, ushort numberOfColumns) { if (array.Length < numberOfColumns) { array = new TupleData[numberOfColumns]; } var nonRefArray = array; return(ReadTupleDataAsync2()); async ValueTask <ReadOnlyMemory <TupleData> > ReadTupleDataAsync2() { for (var i = 0; i < numberOfColumns; i++) { await buf.EnsureAsync(1); var subMessageKind = (TupleDataKind)buf.ReadByte(); switch (subMessageKind) { case TupleDataKind.Null: case TupleDataKind.UnchangedToastedValue: nonRefArray[i] = new TupleData(subMessageKind); continue; case TupleDataKind.TextValue: await buf.EnsureAsync(4); var len = buf.ReadInt32(); await buf.EnsureAsync(len); nonRefArray ![i] = new TupleData(buf.ReadString(len)); continue;
public void Receiver_ReceivedDanmaku(object sender, ReceivedDanmakuArgs e) { MainHolder.pool.submitWorkload(() => { try { JObject json = (JObject)JsonConvert.DeserializeObject(e.Danmaku.RawData); MainHolder.tms.sendDanmakuToCli(e.Danmaku.RawData); switch (e.Danmaku.MsgType) { case MsgTypeEnum.Comment: if (e.Danmaku.IsAdmin) { Log(ConsoleColor.Yellow, "<房管>" + e.Danmaku.UserName + "#" + e.Danmaku.UserID + " > "); } else { Log(ConsoleColor.Gray, e.Danmaku.UserName + "#" + e.Danmaku.UserID + " > "); } Log(ConsoleColor.White, e.Danmaku.CommentText + "\n"); int ml = GetMedalLevelMatchUID(streamer_id, json); if (ml >= 10) { if (!tlist.ContainsKey(e.Danmaku.UserName)) { tlist.Add(e.Danmaku.UserName, ml); } } { int mainsite_level = GetUserMainSiteLevel(json); var uid = GetUserUID(json); /*if (ml < 1//粉丝牌子小于1级 * && mainsite_level < 1//主站等级小于一级 * ) * { * blr.manage.banUID(uid); * Log(ConsoleColor.White, uid + "被直播间自动封禁"); * var user = BiliUser.getUser(uid, MainHolder.biliapi); * MainHolder.broadcaster.BroadcastToAdminGroup(user.name + "#" + user.uid + "\n直播间中被自动封禁:\n" + * ((ml < 1) ? "牌子等级:" + ml + "<1\n" : "") + * ((ml < 1) ? "主站等级:" + mainsite_level + "<1\n" : "") * ); * }*/ } DataBase.me.recBLiveDanmaku(e.Danmaku.UserID, e.Danmaku.CommentText, TimestampHandler.GetTimeStamp(DateTime.Now), lid); if (!DataBase.me.isBiliUserExist(e.Danmaku.UserID)) { new_commers++; } if (!viewerlist.Contains(e.Danmaku.UserID)) { viewerlist.Add(e.Danmaku.UserID); } DataBase.me.addBiliUser(e.Danmaku.UserID, e.Danmaku.UserName); { List <string> bwords = DataBase.me.listBiliveBanwords(); foreach (string bword in bwords) { if (e.Danmaku.CommentText.IndexOf(bword) >= 0) { MainHolder.broadcaster.BroadcastToAdminGroup("直播间检测到疑似违规弹幕:\n" + e.Danmaku.CommentText + "\n发送者:" + e.Danmaku.UserName + "(" + e.Danmaku.UserID + ")"); } } } if (e.Danmaku.CommentText.ToUpper() == "MARK") { if (lid < 0) { blr.sendDanmaku("无法标记:不在直播"); } string id = doMark(e.Danmaku.UserID, TimestampHandler.GetTimeStamp(DateTime.Now)); MainHolder.broadcaster.BroadcastToAdminGroup("放置了一个标记\n" + e.Danmaku.UserName + "#" + e.Danmaku.UserID + "\n标记点ID:" + id); } break; case MsgTypeEnum.GuardBuy: string dpword = "??未知??"; if (!DataBase.me.isBiliUserExist(e.Danmaku.UserID)) { new_commers++; } if (!viewerlist.Contains(e.Danmaku.UserID)) { viewerlist.Add(e.Danmaku.UserID); } DataBase.me.addBiliUser(e.Danmaku.UserID, e.Danmaku.UserName); int coin_gold_ = 0; switch (e.Danmaku.UserGuardLevel) { case 1: coin_gold_ = 19998000; dpword = "总督"; break; case 2: coin_gold_ = 1998000; dpword = "提督"; break; case 3: coin_gold_ = 158000; dpword = "舰长"; break; } gold_coins += coin_gold_; bool isnew = !DataBase.me.isBiliUserGuard(e.Danmaku.UserID); if (lid > 0) { if (isnew) { MainHolder.broadcaster.BroadcastToAdminGroup("欢迎新" + dpword + "!\n" + e.Danmaku.UserName + " #" + e.Danmaku.UserID + "\n时长:" + e.Danmaku.GiftCount); if (MainHolder.useBiliRecFuncs) { if (MainHolder.useBiliRecFuncs) { blr.sendDanmaku("欢迎新" + dpword + "!请留意私信哦~"); } } } else { MainHolder.broadcaster.BroadcastToAdminGroup("欢迎" + dpword + "续航!\n" + e.Danmaku.UserName + " #" + e.Danmaku.UserID + "\n时长:" + e.Danmaku.GiftCount); if (MainHolder.useBiliRecFuncs) { blr.sendDanmaku("欢迎<" + e.Danmaku.UserName + ">续航!"); } } } else { if (isnew) { MainHolder.broadcaster.BroadcastToAdminGroup("侦测到虚空·新" + dpword + "\n" + e.Danmaku.UserName + " #" + e.Danmaku.UserID + "\n时长:" + e.Danmaku.GiftCount); if (MainHolder.useBiliRecFuncs) { blr.sendDanmaku("虚空·新" + dpword + " 已记录 请留意私信~"); } } else { MainHolder.broadcaster.BroadcastToAdminGroup("侦测到虚空·" + dpword + "续航\n" + e.Danmaku.UserName + " #" + e.Danmaku.UserID + "\n时长:" + e.Danmaku.GiftCount); if (MainHolder.useBiliRecFuncs) { blr.sendDanmaku("侦测到虚空续航,嘀嘀嘀~"); } } } DataBase.me.recUserBuyGuard(e.Danmaku.UserID, e.Danmaku.GiftCount, e.Danmaku.UserGuardLevel, lid); //int timestamp = e.Danmaku; //if (timestamp < 1600000000) //{ var timestamp = TimestampHandler.GetTimeStamp(DateTime.Now); //使用备用时间戳生成方式 //} SendKeyToCrewMember(e.Danmaku.UserID, e.Danmaku.GiftCount, e.Danmaku.UserGuardLevel, timestamp, dpword, isnew); break; case MsgTypeEnum.GiftSend: string cointype = json["data"].Value <string>("coin_type"); //silver | gold int coins = json["data"].Value <int>("total_coin"); if (cointype == "silver") { selver_coins += coins; } else { gold_coins += coins; } DataBase.me.recBGift(lid, e.Danmaku.UserID, cointype, coins, e.Danmaku.GiftName); if (!DataBase.me.isBiliUserExist(e.Danmaku.UserID)) { new_commers++; } if (!viewerlist.Contains(e.Danmaku.UserID)) { viewerlist.Add(e.Danmaku.UserID); } DataBase.me.addBiliUser(e.Danmaku.UserID, e.Danmaku.UserName); break; case MsgTypeEnum.Welcome: if (!DataBase.me.isBiliUserExist(e.Danmaku.UserID)) { new_commers++; } if (!viewerlist.Contains(e.Danmaku.UserID)) { viewerlist.Add(e.Danmaku.UserID); } DataBase.me.addBiliUser(e.Danmaku.UserID, e.Danmaku.UserName); break; case MsgTypeEnum.LiveEnd: StreamStopped(); break; default: JObject obj = JObject.Parse(e.Danmaku.RawData); if (obj["cmd"]?.ToObject <string>() == "ROOM_BLOCK_MSG") { List <int> tobebanned = DataBase.me.listPermbans(); int uid = (int)obj["uid"]?.ToObject <int>(); string name = obj["uname"]?.ToObject <string>(); if (tobebanned.Contains(uid)) { break; } //MainHolder.broadcaster.BroadcastToAdminGroup("【直播间禁言】\n" + name + "#" + uid + "被禁言。\n使用\"#bpban " + uid + "\"可将其永久封禁。"); //if (MainHolder.useBiliRecFuncs) MainHolder.bilidmkproc.blr.sendDanmaku(name + "被禁言"); DataBase.me.recBLiveBan(lid, uid, -1); } break; } } catch (Exception err) { MainHolder.broadcaster.BroadcastToAdminGroup("[Exception]\n这条消息可能意味着机器人发生了错误。它仍在继续运行,但可能不是很稳定。下面的信息用来帮助鸡蛋定位错误,管理不必在意。\n[弹幕监视]\nMessageLoop工作正常,该错误不会影响其它弹幕接收。\n\n" + err.Message + "\n\n堆栈跟踪:\n" + err.StackTrace); } }); }
void INpgsqlSimpleTypeHandler <LocalDateTime> .Write(LocalDateTime value, NpgsqlWriteBuffer buf, NpgsqlParameter?parameter) => TimestampHandler.WriteLocalDateTime(value, buf);
LocalDateTime INpgsqlSimpleTypeHandler <LocalDateTime> .Read(NpgsqlReadBuffer buf, int len, FieldDescription?fieldDescription) => TimestampHandler.ReadLocalDateTime(buf);