public static async Task Run([TimerTrigger("0 5 15 * * *")] TimerInfo myTimer, ILogger log) { log.LogInformation($"{nameof(AggregateYesterdayNotes)} executed at {DateTime.Now}"); var credential = new Credential { Domain = GetEnvironmentVariable("MISSKEY_DOMAIN"), ClientSecret = GetEnvironmentVariable("MISSKEY_CLIENT_SECRET"), AccessToken = GetEnvironmentVariable("MISSKEY_ACCESS_TOKEN") }; var misskey = new MisskeyClient(credential); var me = await misskey.IAsync(); var data = await misskey.Charts.Users.NotesAsync(me.Id, "hour", 24 * 2); // 2 days var notes = data.Inc.Skip(1).Take(24).Sum(); var pixela = new PixelaClient(GetEnvironmentVariable("PIXELA_USER"), GetEnvironmentVariable("PIXELA_ACCESS_TOKEN")); var graphs = await pixela.Graphs.ListAsync(); if (graphs.All(w => w.Id != "misskey")) { await pixela.Graphs.CreateAsync("misskey", "Misskey Notes", "note", GraphType.Int, GraphColor.Sora, "Asia/Tokyo"); } await pixela.Pixel.CreateAsync("misskey", DateTime.Today, notes); // Azure Function's timezone is UTC log.LogInformation($"{nameof(AggregateYesterdayNotes)} ended at {DateTime.Now}"); }
protected internal NotesClient(MisskeyClient client) : base(client, "notes") { FavoritesClient = new FavoritesClient(client); Polls = new PollsClient(client); Reactions = new ReactionsClient(client); Watching = new WatchingClient(client); }
private static async Task AuthorizeAsync(MisskeyClient mi, Logger logger) { var app = await mi.App.CreateAsync("RealXelticaBot", "Xeltica Imitation", ((Permission[])Enum.GetValues(typeof(Permission))).Select(p => p.ToStr()).ToArray(), "http://xeltica.work"); var session = await mi.Auth.Session.GenerateAsync(); try { Server.OpenUrl(session.Url); } catch (NotSupportedException) { logger.Error("ユーザー認証のためのURLを開くことができませんでした。以下のURLにアクセスして認証を進めてください。"); logger.Error("> " + session.Url); } logger.Info("ユーザー認証を行います。ウェブブラウザ上で認証が終わったら、コンソールで何かキーを押してください。"); Console.Write("> "); ReadLine(); await mi.Auth.Session.UserKeyAsync(session.Token); var credential = JsonConvert.SerializeObject(mi.Credential); File.WriteAllText("./token", credential); }
/// <summary> /// bot を初期化します。 /// </summary> /// <returns>初期化された <see cref="Shell"/> のインスタンス。</returns> public static async Task <Shell> InitializeAsync() { MisskeyClient mi; var logger = new Logger(nameof(Shell)); try { var credential = File.ReadAllText("./token"); mi = new MisskeyClient(JsonConvert.DeserializeObject <Disboard.Models.Credential>(credential)); logger.Info("Misskey に接続しました。"); } catch (Exception) { logger.Error($"認証に失敗しました。セットアップを開始します。"); Write("Misskey URLを入力してください。> "); var host = ReadLine(); mi = new MisskeyClient(host); await AuthorizeAsync(mi, logger); } var myself = await mi.IAsync(); logger.Info($"bot ユーザーを取得しました (@{myself.Username})"); // 呼ばないとストリームの初期化ができないらしい await mi.Streaming.ConnectAsync(); var sh = new Shell(mi, myself, logger); sh.MaxNoteLength = (await mi.MetaAsync()).MaxNoteTextLength; return(sh); }
public Shell(MisskeyClient mi, User myself, Logger logger) { Logger = logger; Core = new Server(this); Misskey = mi; Myself = new MiUser(myself); SubscribeStreams(); }
protected internal IClient(MisskeyClient client) : base(client, "i") { }
protected internal AggregationClient(MisskeyClient client) : base(client, "aggregation") { Users = new Aggregation.UsersClient(client); }
protected internal NotificationsClient(MisskeyClient client) : base(client, "notifications") { }
protected internal UsersClient(MisskeyClient client) : base(client, "users") { Lists = new ListsClient(client); }
protected internal ReactionsClient(MisskeyClient client) : base(client, "notes/reactions") { }
protected internal FavoritesClient(MisskeyClient client) : base(client, "notes/favorites") { }
protected internal EmojiClient(MisskeyClient client) : base(client, "admin/emoji") { }
protected internal FoldersClient(MisskeyClient client) : base(client, "drive/folders") { }
protected internal AppClient(MisskeyClient client) : base(client, "app") { }
protected internal ListsClient(MisskeyClient client) : base(client, "users/lists") { }
protected internal UsersClient(MisskeyClient client) : base(client, "aggregation/users") { }
protected internal BlockingClient(MisskeyClient client) : base(client, "blocking") { }
protected internal UsernameClient(MisskeyClient client) : base(client, "username") { }
protected internal ChartsClient(MisskeyClient client) : base(client, "charts") { User = new UserClient(client); }
protected internal FederationClient(MisskeyClient client) : base(client, "federation") { }
protected internal MuteClient(MisskeyClient client) : base(client, "mute") { }
protected internal FilesClient(MisskeyClient client) : base(client, "drive/files") { }
protected internal MessagingClient(MisskeyClient client) : base(client, "messaging") { Messages = new MessagesClient(client); }
protected internal MyClient(MisskeyClient client) : base(client, "my") { }
protected internal PollsClient(MisskeyClient client) : base(client, "notes/polls") { }
protected internal FollowingClient(MisskeyClient client) : base(client, "following") { Requests = new RequestsClient(client); }
protected internal RequestsClient(MisskeyClient client) : base(client, "following/requests") { }
protected internal AdminClient(MisskeyClient client) : base(client, "admin") { Emoji = new Admin.EmojiClient(client); }
protected internal UserClient(MisskeyClient client) : base(client, "charts/user") { }
protected internal HashtagsClient(MisskeyClient client) : base(client, "hashtags") { }