我使用 Telegram.Bot 库编写了一个简单的机器人。现在我想对这个消息做出回应。这最近被添加到机器人 API 中。函数“setMessageReaction”。但麻烦的是,Telegram.Bot 库自 2023 年 5 月以来就没有更新过。它不知道这个功能。如何通过 API 发送反应?是否可以将其与当前基于 Telegram.Bot 构建的项目结合起来?或者,一般来说,C# 有一个更方便的库吗?
Visual Studio 2022 C# 包:Telegram.Bot
我使用 Telegram.Bot 库编写了一个简单的机器人。现在我想对这个消息做出回应。这最近被添加到机器人 API 中。函数“setMessageReaction”。但麻烦的是,Telegram.Bot 库自 2023 年 5 月以来就没有更新过。它不知道这个功能。如何通过 API 发送反应?是否可以将其与当前基于 Telegram.Bot 构建的项目结合起来?或者,一般来说,C# 有一个更方便的库吗?
Visual Studio 2022 C# 包:Telegram.Bot
任务本身很简单,将其分割,然后在分割后的子串上添加分隔符号。
但不是。
需要对一个大字符串进行分割,即在保留子字符串中分隔符的同时,不能创建新的字符串!
我尝试使用string.split和Regex.Split进行分割,但结果是相同的,分隔符被删除。
我尝试了这些选项:
var str = "hello=world=";
foreach (var subStr in str.Split('='))
Console.WriteLine(subStr);
foreach (var subStr in Regex.Split(str, "="))
Console.WriteLine(subStr);
foreach (var subStr in Regex.Split(str, @"(\=)"))
Console.WriteLine(subStr);
但它们都不合适,它们的控制台输出是:
hello
world
hello
world
hello
=
world
=
结果是我所期望的:
hello=
world=
我需要每 5 秒通过 UDP 向服务器发送某个 LinkStatus 数据包。此外,如果服务器连续超过5次没有响应,则需要通知用户并尝试恢复连接。
我围绕 UdpClient 做了一个包装器,其中有方法:用于连接
public void Connect()
{
_client.Connect(new IPEndPoint(_ipAddress, _port));
StartReceiveAsync();
}
把关掉
public void Disconnect()
{
_client.Dispose();
}
发送包裹:
public async Task SendAsync(IRequest request)
{
await _client.SendAsync(request.Bytes);
}
要在单独的线程中接收包:
private void StartReceiveAsync()
{
var receive = new Task(async () =>
{
try
{
while (true)
{
var receivedResults = await _client.ReceiveAsync();
Notify?.Invoke(receivedResults.Buffer);
}
}
catch
{
Console.WriteLine("Прием сообщений был прерван");
}
}, TaskCreationOptions.LongRunning);
receive.Start();
}
使用此包装器的工作是在单独的服务中进行的。实现向服务发送连接状态请求、检查未收到响应的次数以及终止从服务器接收消息的线程的方法的最佳方法是什么?
我有两个类:ItemAmmunition 和 ItemConsumables。它们的工作方式相同,但主要区别在于 ItemAmmunition 可以放置在 MainCell 和 AmmunitionCell 中,而 ItemConsumables 只能放置在 MainCell 中。这就是所有问题的开始!
MainCell 中的非工作代码。
public void OnDrop(PointerEventData eventData)
{
var a = eventData.pointerDrag.GetComponent<ItemConsumables>();
if (eventData.pointerDrag.GetComponent<ItemConsumables>() != null)
a = eventData.pointerDrag.GetComponent<ItemConsumables>();
else
a = eventData.pointerDrag.GetComponent<ItemAmmunition>();
if (CheckCellFree(this, a.size))
{
a.prevMainCell = this;
a.SetPosition(a.gameObject, this, null);
CellOccupation(this, false, dragItem.size);
}
else
{
dragItem.SetPosition(dragItem.gameObject, dragItem.prevMainCell, null);
CellOccupation(dragItem.prevMainCell, false, dragItem.size);
}
}
我什至无法正常找出其中包含的内容并写下来!如果我像这样执行此代码(第一个代码,但已被我更正。):
public void OnDrop(PointerEventData eventData)
{
if (eventData.pointerDrag.GetComponent<ItemConsumables>() != null)
{
var a = eventData.pointerDrag.GetComponent<ItemConsumables>();
if (CheckCellFree(this, a.size))
{
a.prevMainCell = this;
a.SetPosition(a.gameObject, this, null);
CellOccupation(this, false, a.size);
}
else
{
dragItem.SetPosition(a.gameObject, a.prevMainCell, null);
CellOccupation(a.prevMainCell, false, a.size);
}
}
else
{
var a = eventData.pointerDrag.GetComponent<ItemAmmunition>();
if (CheckCellFree(this, a.size))
{
a.prevMainCell = this;
a.SetPosition(a.gameObject, this, null);
CellOccupation(this, false, a.size);
}
else
{
dragItem.SetPosition(a.gameObject, a.prevMainCell, null);
CellOccupation(a.prevMainCell, false, a.size);
}
}
}
事实证明这很长!我已经为此苦苦挣扎了很长时间。如何缩短这些 if-else 语句,以及一般如何分配这些变量?我不想发明自行车。
有VM类:
public class SyllabusVM
{
public string TitleSyllabus { get; set; } = string.Empty;
public List<SemestrVM>? Semesters { get; set; }
}
public class SemestrVM
{
public int Number { get; set; }
public List<DisciplineVM>? DisciplineS { get; set; }
}
public class DisciplineVM
{
public string Subject { get; set; } = string.Empty;
public int HoursLecture { get; set; }
public int HoursPractice { get; set; }
public string TypeOfControl { get; set; } = string.Empty;
}
对于 VM 模型类:
public class SyllabusModel
{
public string TitleSyllabus { get; set; } = string.Empty;
public List<SemestrModel>? Semesters { get; set; }
}
public class SemestrModel
{
public int Number { get; set; }
public List<DisciplineModel>? DisciplineS { get; set; }
}
public class DisciplineModel
{
public string Subject { get; set; } = string.Empty;
public int HoursLecture { get; set; }
public int HoursPractice { get; set; }
public string TypeOfControl { get; set; } = string.Empty;
}
我需要管理每个嵌套内的列表(添加、删除和更改),以及序列化和反序列化,我是否正确理解需要什么:
例子:
public class SyllabusViewModel : ReactiveObject
{
public ReactiveCommand<Unit,Unit> CreateSyllabucCommand { get; set; }
public ReactiveCommand<Unit,Unit> EditSyllabucCommand { get; set; }
public ReactiveCommand<Unit,Unit> DeleteSyllabucCommand { get; set; }
public ObservableCollection<SyllabusVM> Curriculum { get; set; }
public SyllabusViewModel()
{
Curriculum = new ObservableCollection<SyllabusVM>();
//МАПИНГ
foreach (var syllabus in serviceData.GetDataSyllabus())
Curriculum.Add(syllabus);
//МАПИНГ
CreateSyllabucCommand = ReactiveCommand.Create(CreateSyllabus);
EditSyllabucCommand = ReactiveCommand.Create(EditeSyllabus);
DeleteSyllabucCommand = ReactiveCommand.Create(DeleteSyllabus);
}
void CreateSyllabus() { }
void EditeSyllabus() { }
void DeleteSyllabus() { }
}
这样的 ViewModel 是上述每个 VM 的包装器。是否需要这些包装器或者该逻辑应该位于上述虚拟机中???
如何正确序列化此类嵌套。遍历顶层并通过 foreach-foreach-foreach 遍历每个嵌套,并将 VM 类型映射到模型中并序列化。或者每一层都必须自己进行映射。或者也许是其他东西,如果需要的话,可以理解嵌套和映射的序列化))。
每个课程表都是一个Json文件,插入到服务中的ICollection中,映射到SyllabusVM并返回public ObservableCollection<SyllabusVM> Curriculum { get; set; }.
每层是否都需要为其自己的列表进行此类映射,或者应该仅在嵌套的最顶层进行映射,在几个 foreach-foreach-foreach 循环中完成整个嵌套???
请告诉我)))