├── DotNetSocialBot.Function ├── Program.cs ├── Properties │ └── launchSettings.json ├── StatusExtensions.cs ├── host.json ├── DotNetSocialBot.Function.csproj ├── Config.cs ├── .gitignore └── RepostOnMastodon.cs ├── .idea └── .idea.DotNetSocialBot │ └── .idea │ ├── encodings.xml │ ├── vcs.xml │ └── indexLayout.xml ├── DotNetSocialBot.sln ├── LICENSE.md ├── README.md └── .gitignore /DotNetSocialBot.Function/Program.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.Hosting; 2 | 3 | var host = new HostBuilder() 4 | .ConfigureFunctionsWorkerDefaults() 5 | .Build(); 6 | 7 | host.Run(); 8 | -------------------------------------------------------------------------------- /.idea/.idea.DotNetSocialBot/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/.idea.DotNetSocialBot/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /DotNetSocialBot.Function/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "DotNetSocialBot.Function": { 4 | "commandName": "Project", 5 | "commandLineArgs": "--port 7245", 6 | "launchBrowser": false 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /.idea/.idea.DotNetSocialBot/.idea/indexLayout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /DotNetSocialBot.Function/StatusExtensions.cs: -------------------------------------------------------------------------------- 1 | using Mastonet.Entities; 2 | 3 | namespace DotNetSocialBot.FunctionApp; 4 | 5 | public static class StatusExtensions 6 | { 7 | public static bool IsReply(this Status? status) 8 | { 9 | return status?.InReplyToId != null; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /DotNetSocialBot.Function/host.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0", 3 | "logging": { 4 | "applicationInsights": { 5 | "samplingSettings": { 6 | "isEnabled": true, 7 | "excludedTypes": "Request" 8 | }, 9 | "enableLiveMetricsFilters": true 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /DotNetSocialBot.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetSocialBot.Function", "DotNetSocialBot.Function\DotNetSocialBot.Function.csproj", "{271705B1-532F-4531-B20E-B69CD5167846}" 4 | EndProject 5 | Global 6 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 7 | Debug|Any CPU = Debug|Any CPU 8 | Release|Any CPU = Release|Any CPU 9 | EndGlobalSection 10 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 11 | {271705B1-532F-4531-B20E-B69CD5167846}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 12 | {271705B1-532F-4531-B20E-B69CD5167846}.Debug|Any CPU.Build.0 = Debug|Any CPU 13 | {271705B1-532F-4531-B20E-B69CD5167846}.Release|Any CPU.ActiveCfg = Release|Any CPU 14 | {271705B1-532F-4531-B20E-B69CD5167846}.Release|Any CPU.Build.0 = Release|Any CPU 15 | EndGlobalSection 16 | EndGlobal 17 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 bitbonk 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /DotNetSocialBot.Function/DotNetSocialBot.Function.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | net8.0 4 | v4 5 | Exe 6 | enable 7 | enable 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | PreserveNewest 19 | 20 | 21 | PreserveNewest 22 | Never 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This repo is no loger actively maintained, as the https://dotnet.social Mastodon community took ownership of the bot and the code. 2 | Development of the bot continues at this fork: https://github.com/dotnet-social/bot 3 | 4 | # dotnet.social Mastodon bot 5 | 6 | This is the code for the Mastodon bot [@bot@dotnet.social](https://dotnet.social/@bot). 7 | Its goal ist to help grow and connect the .NET community on Mastodon by boosting posts that talk about .NET. 8 | 9 | The code is generic and could be used for any kind of bot that should boost posts, not just about .NET. 10 | 11 | The bot runs as an Azure function and boosts posts 12 | 13 | - where the bot was @ mentioned, 14 | - that contain at least one # hashtag that the bot follows, 15 | - that has a boost request reply, i.e. a reply with the message `boost this!` ([or similar](https://github.com/bitbonk/DotNetSocialBot/blob/d889186a212a02ca7b41d0ee955bf077323897f9/DotNetSocialBot.FunctionApp/Config.cs#L5)) 16 | 17 | Posts are generally only boosted if the post to boost 18 | 19 | - does not come from this bot account itself, 20 | - does not come from any account that is marked as a bot, 21 | - is not a direct message, 22 | - is not a reply 23 | 24 | ## Contribution 25 | 26 | I am aware that this little experiment is a rather naive implementation. 27 | Any kind of contribution to make this bot better is welcome. 28 | 29 | ## Thanks 30 | 31 | - [Guillaume Lacasa](https://github.com/glacasa) ([@glacasa@mamot.fr](https://mamot.fr/@glacasa) on Mastodon) for building and maintaining [Mastonet](https://github.com/glacasa/mastonet) 32 | -------------------------------------------------------------------------------- /DotNetSocialBot.Function/Config.cs: -------------------------------------------------------------------------------- 1 | namespace DotNetSocialBot.Function; 2 | 3 | internal static class Config 4 | { 5 | public static readonly string[] ValidBoostRequestMessages = 6 | { 7 | "bot boost this", 8 | "bot boost that", 9 | "bot boost it", 10 | "bot boost", 11 | "bot boost this please", 12 | "bot boost that please", 13 | "bot boost it please", 14 | "bot boost please", 15 | "bot boost this, please", 16 | "bot boost that, please", 17 | "bot boost it, please", 18 | "bot boost, please", 19 | "bot boost this!", 20 | "bot boost that!", 21 | "bot boost it!", 22 | "bot boost!", 23 | "bot boost this please!", 24 | "bot boost that please!", 25 | "bot boost it please!", 26 | "bot boost please!", 27 | "bot boost this, please!", 28 | "bot boost that, please!", 29 | "bot boost it, please!", 30 | "bot boost, please!", 31 | "bot boost this ☝️", 32 | "bot boost that ☝️", 33 | "bot boost it ☝️", 34 | "bot boost ☝️", 35 | "bot boost this please ☝️", 36 | "bot boost that please ☝️", 37 | "bot boost it please ☝️", 38 | "bot boost please ☝️", 39 | "bot boost this, please ☝️", 40 | "bot boost that, please ☝️", 41 | "bot boost it, please ☝️", 42 | "bot boost, please ☝️", 43 | "bot boost this! ☝️", 44 | "bot boost that! ☝️", 45 | "bot boost it! ☝️", 46 | "bot boost! ☝️", 47 | "bot boost this please! ☝️", 48 | "bot boost that please! ☝️", 49 | "bot boost it please! ☝️", 50 | "bot boost please! ☝️", 51 | "bot boost this, please! ☝️", 52 | "bot boost that, please! ☝️", 53 | "bot boost it, please! ☝️", 54 | "bot boost, please! ☝️" 55 | }; 56 | 57 | public static string AccessToken => 58 | Environment.GetEnvironmentVariable("access_token", EnvironmentVariableTarget.Process) ?? 59 | throw new InvalidOperationException("access_token token not present in environment variables"); 60 | 61 | public static string Instance => 62 | Environment.GetEnvironmentVariable("instance", EnvironmentVariableTarget.Process) ?? 63 | throw new InvalidOperationException("instance not present in environment variables"); 64 | } 65 | -------------------------------------------------------------------------------- /DotNetSocialBot.Function/.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # Azure Functions localsettings file 5 | local.settings.json 6 | 7 | # User-specific files 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Build results 17 | [Dd]ebug/ 18 | [Dd]ebugPublic/ 19 | [Rr]elease/ 20 | [Rr]eleases/ 21 | x64/ 22 | x86/ 23 | bld/ 24 | [Bb]in/ 25 | [Oo]bj/ 26 | [Ll]og/ 27 | 28 | # Visual Studio 2015 cache/options directory 29 | .vs/ 30 | # Uncomment if you have tasks that create the project's static files in wwwroot 31 | #wwwroot/ 32 | 33 | # MSTest test Results 34 | [Tt]est[Rr]esult*/ 35 | [Bb]uild[Ll]og.* 36 | 37 | # NUNIT 38 | *.VisualState.xml 39 | TestResult.xml 40 | 41 | # Build Results of an ATL Project 42 | [Dd]ebugPS/ 43 | [Rr]eleasePS/ 44 | dlldata.c 45 | 46 | # DNX 47 | project.lock.json 48 | project.fragment.lock.json 49 | artifacts/ 50 | 51 | *_i.c 52 | *_p.c 53 | *_i.h 54 | *.ilk 55 | *.meta 56 | *.obj 57 | *.pch 58 | *.pdb 59 | *.pgc 60 | *.pgd 61 | *.rsp 62 | *.sbr 63 | *.tlb 64 | *.tli 65 | *.tlh 66 | *.tmp 67 | *.tmp_proj 68 | *.log 69 | *.vspscc 70 | *.vssscc 71 | .builds 72 | *.pidb 73 | *.svclog 74 | *.scc 75 | 76 | # Chutzpah Test files 77 | _Chutzpah* 78 | 79 | # Visual C++ cache files 80 | ipch/ 81 | *.aps 82 | *.ncb 83 | *.opendb 84 | *.opensdf 85 | *.sdf 86 | *.cachefile 87 | *.VC.db 88 | *.VC.VC.opendb 89 | 90 | # Visual Studio profiler 91 | *.psess 92 | *.vsp 93 | *.vspx 94 | *.sap 95 | 96 | # TFS 2012 Local Workspace 97 | $tf/ 98 | 99 | # Guidance Automation Toolkit 100 | *.gpState 101 | 102 | # ReSharper is a .NET coding add-in 103 | _ReSharper*/ 104 | *.[Rr]e[Ss]harper 105 | *.DotSettings.user 106 | 107 | # JustCode is a .NET coding add-in 108 | .JustCode 109 | 110 | # TeamCity is a build add-in 111 | _TeamCity* 112 | 113 | # DotCover is a Code Coverage Tool 114 | *.dotCover 115 | 116 | # NCrunch 117 | _NCrunch_* 118 | .*crunch*.local.xml 119 | nCrunchTemp_* 120 | 121 | # MightyMoose 122 | *.mm.* 123 | AutoTest.Net/ 124 | 125 | # Web workbench (sass) 126 | .sass-cache/ 127 | 128 | # Installshield output folder 129 | [Ee]xpress/ 130 | 131 | # DocProject is a documentation generator add-in 132 | DocProject/buildhelp/ 133 | DocProject/Help/*.HxT 134 | DocProject/Help/*.HxC 135 | DocProject/Help/*.hhc 136 | DocProject/Help/*.hhk 137 | DocProject/Help/*.hhp 138 | DocProject/Help/Html2 139 | DocProject/Help/html 140 | 141 | # Click-Once directory 142 | publish/ 143 | 144 | # Publish Web Output 145 | *.[Pp]ublish.xml 146 | *.azurePubxml 147 | # TODO: Comment the next line if you want to checkin your web deploy settings 148 | # but database connection strings (with potential passwords) will be unencrypted 149 | #*.pubxml 150 | *.publishproj 151 | 152 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 153 | # checkin your Azure Web App publish settings, but sensitive information contained 154 | # in these scripts will be unencrypted 155 | PublishScripts/ 156 | 157 | # NuGet Packages 158 | *.nupkg 159 | # The packages folder can be ignored because of Package Restore 160 | **/packages/* 161 | # except build/, which is used as an MSBuild target. 162 | !**/packages/build/ 163 | # Uncomment if necessary however generally it will be regenerated when needed 164 | #!**/packages/repositories.config 165 | # NuGet v3's project.json files produces more ignoreable files 166 | *.nuget.props 167 | *.nuget.targets 168 | 169 | # Microsoft Azure Build Output 170 | csx/ 171 | *.build.csdef 172 | 173 | # Microsoft Azure Emulator 174 | ecf/ 175 | rcf/ 176 | 177 | # Windows Store app package directories and files 178 | AppPackages/ 179 | BundleArtifacts/ 180 | Package.StoreAssociation.xml 181 | _pkginfo.txt 182 | 183 | # Visual Studio cache files 184 | # files ending in .cache can be ignored 185 | *.[Cc]ache 186 | # but keep track of directories ending in .cache 187 | !*.[Cc]ache/ 188 | 189 | # Others 190 | ClientBin/ 191 | ~$* 192 | *~ 193 | *.dbmdl 194 | *.dbproj.schemaview 195 | *.jfm 196 | *.pfx 197 | *.publishsettings 198 | node_modules/ 199 | orleans.codegen.cs 200 | 201 | # Since there are multiple workflows, uncomment next line to ignore bower_components 202 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 203 | #bower_components/ 204 | 205 | # RIA/Silverlight projects 206 | Generated_Code/ 207 | 208 | # Backup & report files from converting an old project file 209 | # to a newer Visual Studio version. Backup files are not needed, 210 | # because we have git ;-) 211 | _UpgradeReport_Files/ 212 | Backup*/ 213 | UpgradeLog*.XML 214 | UpgradeLog*.htm 215 | 216 | # SQL Server files 217 | *.mdf 218 | *.ldf 219 | 220 | # Business Intelligence projects 221 | *.rdl.data 222 | *.bim.layout 223 | *.bim_*.settings 224 | 225 | # Microsoft Fakes 226 | FakesAssemblies/ 227 | 228 | # GhostDoc plugin setting file 229 | *.GhostDoc.xml 230 | 231 | # Node.js Tools for Visual Studio 232 | .ntvs_analysis.dat 233 | 234 | # Visual Studio 6 build log 235 | *.plg 236 | 237 | # Visual Studio 6 workspace options file 238 | *.opt 239 | 240 | # Visual Studio LightSwitch build output 241 | **/*.HTMLClient/GeneratedArtifacts 242 | **/*.DesktopClient/GeneratedArtifacts 243 | **/*.DesktopClient/ModelManifest.xml 244 | **/*.Server/GeneratedArtifacts 245 | **/*.Server/ModelManifest.xml 246 | _Pvt_Extensions 247 | 248 | # Paket dependency manager 249 | .paket/paket.exe 250 | paket-files/ 251 | 252 | # FAKE - F# Make 253 | .fake/ 254 | 255 | # JetBrains Rider 256 | .idea/ 257 | *.sln.iml 258 | 259 | # CodeRush 260 | .cr/ 261 | 262 | # Python Tools for Visual Studio (PTVS) 263 | __pycache__/ 264 | *.pyc -------------------------------------------------------------------------------- /DotNetSocialBot.Function/RepostOnMastodon.cs: -------------------------------------------------------------------------------- 1 | using DotNetSocialBot.FunctionApp; 2 | using HtmlAgilityPack; 3 | using Mastonet; 4 | using Mastonet.Entities; 5 | using Microsoft.Azure.Functions.Worker; 6 | using Microsoft.Extensions.Logging; 7 | 8 | namespace DotNetSocialBot.Function; 9 | 10 | public class RepostOnMastodon 11 | { 12 | private readonly MastodonClient _client; 13 | private readonly ILogger _logger; 14 | private Account? _currentUser; 15 | 16 | public RepostOnMastodon(ILoggerFactory loggerFactory) 17 | { 18 | _logger = loggerFactory.CreateLogger(); 19 | _logger.LogInformation("Initializing function {FunctionName}", nameof(RepostOnMastodon)); 20 | var handler = new HttpClientHandler(); 21 | #if DEBUG // TODO: find out why certs are not accepted locally 22 | handler.ServerCertificateCustomValidationCallback = (_, _, _, _) => true; 23 | #endif 24 | _client = new MastodonClient(Config.Instance, Config.AccessToken, new HttpClient(handler)); 25 | } 26 | 27 | [Function(nameof(RepostOnMastodon))] 28 | public async Task RunAsync([TimerTrigger("0 * * * * *")] TimerInfo myTimer) 29 | { 30 | _logger.LogInformation( 31 | "Started function {FunctionName} at {StartTime}", nameof(RepostOnMastodon), 32 | DateTime.Now); 33 | _currentUser = await _client.GetCurrentUser(); 34 | await HandleNotifications(); 35 | await BoostTags(); 36 | _logger.LogInformation( 37 | "Completed function {FunctionName} at {EndTime}", nameof(RepostOnMastodon), 38 | DateTime.Now); 39 | } 40 | 41 | private async Task HandleNotifications() 42 | { 43 | var notifications = await _client 44 | .GetNotifications(excludeTypes: NotificationType.Follow | NotificationType.Favourite | 45 | NotificationType.Reblog); 46 | 47 | try 48 | { 49 | foreach (var notification in notifications 50 | .Where(n => n.Status?.Account?.Bot != true)) 51 | if (!notification.Status.IsReply()) 52 | await BoostDirectMention(notification); 53 | else 54 | await BoostBoostRequest(notification); 55 | } 56 | finally 57 | { 58 | await _client.ClearNotifications(); 59 | _logger.LogInformation("Cleared all notifications"); 60 | } 61 | } 62 | 63 | private async Task BoostBoostRequest(Notification notification) 64 | { 65 | var document = new HtmlDocument(); 66 | document.LoadHtml(notification.Status?.Content); 67 | var replyText = document.DocumentNode.InnerText; 68 | if (Config.ValidBoostRequestMessages.Any(m => 69 | replyText.EndsWith(m, StringComparison.InvariantCultureIgnoreCase))) 70 | { 71 | var statusIdToBoost = notification.Status?.InReplyToId; 72 | if (statusIdToBoost is not null) 73 | { 74 | var statusToBoost = await _client.GetStatus(statusIdToBoost); 75 | if (statusToBoost.IsReply() 76 | || statusToBoost.Account.Bot == true 77 | || statusToBoost.Account.Id == _currentUser!.Id 78 | || statusToBoost.Reblogged == true) 79 | { 80 | await _client.PublishStatus("That's nothing I can boost. 😔", 81 | replyStatusId: notification.Status?.Id); 82 | _logger.LogInformation("Denied boost request from @{Account} from {PostTime}", 83 | notification.Account.AccountName, notification.Status?.CreatedAt); 84 | } 85 | else 86 | { 87 | await _client.Reblog(statusToBoost.Id); 88 | _logger.LogInformation 89 | ("Boosted post from @{Account} from {PostTime}, requested by @{RequesterAccount} at {RequestTime}", 90 | statusToBoost.Account.AccountName, 91 | statusToBoost.CreatedAt, 92 | notification.Account.AccountName, 93 | notification.Status?.CreatedAt); 94 | } 95 | } 96 | } 97 | } 98 | 99 | private async Task BoostDirectMention(Notification notification) 100 | { 101 | var statusId = notification.Status?.Id; 102 | if (statusId is null) 103 | { 104 | _logger.LogError( 105 | "Could not determine ID of status that mentioned me, ignoring post by @{Account} from {PostTime}", 106 | notification.Status?.Account.AccountName, 107 | notification.Status?.CreatedAt); 108 | return; 109 | } 110 | 111 | var statusVisibility = notification.Status?.Visibility; 112 | if (statusVisibility is null) 113 | { 114 | _logger.LogError( 115 | "Could not determine visibility of status that mentioned me, ignoring post by @{Account} from {PostTime}", 116 | notification.Status?.Account.AccountName, 117 | notification.Status?.CreatedAt); 118 | return; 119 | } 120 | 121 | if (statusVisibility == Visibility.Direct) 122 | { 123 | _logger.LogInformation( 124 | "Ignoring direct message post by @{Account} from {PostTime}", 125 | notification.Status?.Account.AccountName, 126 | notification.Status?.CreatedAt); 127 | return; 128 | } 129 | 130 | await _client.Reblog(statusId); 131 | _logger.LogInformation("Boosted post that mentioned me by @{Account} from {PostTime}", 132 | notification.Account.AccountName, 133 | notification.Status?.CreatedAt); 134 | } 135 | 136 | private async Task BoostTags() 137 | { 138 | var followedTags = await _client.ViewFollowedTags(); 139 | if (!followedTags.Any()) return; 140 | 141 | foreach (var status in (await _client.GetHomeTimeline(new ArrayOptions { Limit = 100 })).Where(s => 142 | !s.IsReply() 143 | && s.Reblogged != true 144 | && s.Reblog is null 145 | && s.Account.Bot != true 146 | && s.Account.Id != _currentUser!.Id)) 147 | { 148 | var followedTagsInPost = status.Tags.Select(t => t.Name) 149 | .Intersect(followedTags.Select(t => t.Name), StringComparer.OrdinalIgnoreCase).ToList(); 150 | 151 | await _client.Reblog(status.Id); 152 | _logger.LogInformation( 153 | "Boosted hash-tagged post by @{Account} from {PostTime} because of followed hashtags {FollowedTagsInPost}", 154 | status.Account.AccountName, 155 | status.CreatedAt, 156 | followedTagsInPost); 157 | } 158 | } 159 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/visualstudio,rider,azurite,azurefunctions 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=visualstudio,rider,azurite,azurefunctions 3 | 4 | ### AzureFunctions ### 5 | # Azure Functions localsettings file 6 | local.settings.json 7 | 8 | ### Azurite ### 9 | # Azurite queue 10 | __queuestorage__ 11 | __azurite_db_queue__.json 12 | __azurite_db_queue_extent__.json 13 | 14 | # Azurite blob 15 | __blobstorage__ 16 | __azurite_db_blob__.json 17 | __azurite_db_blob_extent__.json 18 | 19 | # Azurite table 20 | __azurite_db_table__.json 21 | __azurite_db_table_extent__.json 22 | 23 | ### Rider ### 24 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 25 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 26 | 27 | # User-specific stuff 28 | .idea/**/workspace.xml 29 | .idea/**/tasks.xml 30 | .idea/**/usage.statistics.xml 31 | .idea/**/dictionaries 32 | .idea/**/shelf 33 | 34 | # AWS User-specific 35 | .idea/**/aws.xml 36 | 37 | # Generated files 38 | .idea/**/contentModel.xml 39 | 40 | # Sensitive or high-churn files 41 | .idea/**/dataSources/ 42 | .idea/**/dataSources.ids 43 | .idea/**/dataSources.local.xml 44 | .idea/**/sqlDataSources.xml 45 | .idea/**/dynamic.xml 46 | .idea/**/uiDesigner.xml 47 | .idea/**/dbnavigator.xml 48 | 49 | # Gradle 50 | .idea/**/gradle.xml 51 | .idea/**/libraries 52 | 53 | # Gradle and Maven with auto-import 54 | # When using Gradle or Maven with auto-import, you should exclude module files, 55 | # since they will be recreated, and may cause churn. Uncomment if using 56 | # auto-import. 57 | # .idea/artifacts 58 | # .idea/compiler.xml 59 | # .idea/jarRepositories.xml 60 | # .idea/modules.xml 61 | # .idea/*.iml 62 | # .idea/modules 63 | # *.iml 64 | # *.ipr 65 | 66 | # CMake 67 | cmake-build-*/ 68 | 69 | # Mongo Explorer plugin 70 | .idea/**/mongoSettings.xml 71 | 72 | # File-based project format 73 | *.iws 74 | 75 | # IntelliJ 76 | out/ 77 | 78 | # mpeltonen/sbt-idea plugin 79 | .idea_modules/ 80 | 81 | # JIRA plugin 82 | atlassian-ide-plugin.xml 83 | 84 | # Cursive Clojure plugin 85 | .idea/replstate.xml 86 | 87 | # SonarLint plugin 88 | .idea/sonarlint/ 89 | 90 | # Crashlytics plugin (for Android Studio and IntelliJ) 91 | com_crashlytics_export_strings.xml 92 | crashlytics.properties 93 | crashlytics-build.properties 94 | fabric.properties 95 | 96 | # Editor-based Rest Client 97 | .idea/httpRequests 98 | 99 | # Android studio 3.1+ serialized cache file 100 | .idea/caches/build_file_checksums.ser 101 | 102 | ### VisualStudio ### 103 | ## Ignore Visual Studio temporary files, build results, and 104 | ## files generated by popular Visual Studio add-ons. 105 | ## 106 | ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore 107 | 108 | # User-specific files 109 | *.rsuser 110 | *.suo 111 | *.user 112 | *.userosscache 113 | *.sln.docstates 114 | 115 | # User-specific files (MonoDevelop/Xamarin Studio) 116 | *.userprefs 117 | 118 | # Mono auto generated files 119 | mono_crash.* 120 | 121 | # Build results 122 | [Dd]ebug/ 123 | [Dd]ebugPublic/ 124 | [Rr]elease/ 125 | [Rr]eleases/ 126 | x64/ 127 | x86/ 128 | [Ww][Ii][Nn]32/ 129 | [Aa][Rr][Mm]/ 130 | [Aa][Rr][Mm]64/ 131 | bld/ 132 | [Bb]in/ 133 | [Oo]bj/ 134 | [Ll]og/ 135 | [Ll]ogs/ 136 | 137 | # Visual Studio 2015/2017 cache/options directory 138 | .vs/ 139 | # Uncomment if you have tasks that create the project's static files in wwwroot 140 | #wwwroot/ 141 | 142 | # Visual Studio 2017 auto generated files 143 | Generated\ Files/ 144 | 145 | # MSTest test Results 146 | [Tt]est[Rr]esult*/ 147 | [Bb]uild[Ll]og.* 148 | 149 | # NUnit 150 | *.VisualState.xml 151 | TestResult.xml 152 | nunit-*.xml 153 | 154 | # Build Results of an ATL Project 155 | [Dd]ebugPS/ 156 | [Rr]eleasePS/ 157 | dlldata.c 158 | 159 | # Benchmark Results 160 | BenchmarkDotNet.Artifacts/ 161 | 162 | # .NET Core 163 | project.lock.json 164 | project.fragment.lock.json 165 | artifacts/ 166 | 167 | # ASP.NET Scaffolding 168 | ScaffoldingReadMe.txt 169 | 170 | # StyleCop 171 | StyleCopReport.xml 172 | 173 | # Files built by Visual Studio 174 | *_i.c 175 | *_p.c 176 | *_h.h 177 | *.ilk 178 | *.meta 179 | *.obj 180 | *.iobj 181 | *.pch 182 | *.pdb 183 | *.ipdb 184 | *.pgc 185 | *.pgd 186 | *.rsp 187 | *.sbr 188 | *.tlb 189 | *.tli 190 | *.tlh 191 | *.tmp 192 | *.tmp_proj 193 | *_wpftmp.csproj 194 | *.log 195 | *.tlog 196 | *.vspscc 197 | *.vssscc 198 | .builds 199 | *.pidb 200 | *.svclog 201 | *.scc 202 | 203 | # Chutzpah Test files 204 | _Chutzpah* 205 | 206 | # Visual C++ cache files 207 | ipch/ 208 | *.aps 209 | *.ncb 210 | *.opendb 211 | *.opensdf 212 | *.sdf 213 | *.cachefile 214 | *.VC.db 215 | *.VC.VC.opendb 216 | 217 | # Visual Studio profiler 218 | *.psess 219 | *.vsp 220 | *.vspx 221 | *.sap 222 | 223 | # Visual Studio Trace Files 224 | *.e2e 225 | 226 | # TFS 2012 Local Workspace 227 | $tf/ 228 | 229 | # Guidance Automation Toolkit 230 | *.gpState 231 | 232 | # ReSharper is a .NET coding add-in 233 | _ReSharper*/ 234 | *.[Rr]e[Ss]harper 235 | *.DotSettings.user 236 | 237 | # TeamCity is a build add-in 238 | _TeamCity* 239 | 240 | # DotCover is a Code Coverage Tool 241 | *.dotCover 242 | 243 | # AxoCover is a Code Coverage Tool 244 | .axoCover/* 245 | !.axoCover/settings.json 246 | 247 | # Coverlet is a free, cross platform Code Coverage Tool 248 | coverage*.json 249 | coverage*.xml 250 | coverage*.info 251 | 252 | # Visual Studio code coverage results 253 | *.coverage 254 | *.coveragexml 255 | 256 | # NCrunch 257 | _NCrunch_* 258 | .*crunch*.local.xml 259 | nCrunchTemp_* 260 | 261 | # MightyMoose 262 | *.mm.* 263 | AutoTest.Net/ 264 | 265 | # Web workbench (sass) 266 | .sass-cache/ 267 | 268 | # Installshield output folder 269 | [Ee]xpress/ 270 | 271 | # DocProject is a documentation generator add-in 272 | DocProject/buildhelp/ 273 | DocProject/Help/*.HxT 274 | DocProject/Help/*.HxC 275 | DocProject/Help/*.hhc 276 | DocProject/Help/*.hhk 277 | DocProject/Help/*.hhp 278 | DocProject/Help/Html2 279 | DocProject/Help/html 280 | 281 | # Click-Once directory 282 | publish/ 283 | 284 | # Publish Web Output 285 | *.[Pp]ublish.xml 286 | *.azurePubxml 287 | # Note: Comment the next line if you want to checkin your web deploy settings, 288 | # but database connection strings (with potential passwords) will be unencrypted 289 | *.pubxml 290 | *.publishproj 291 | 292 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 293 | # checkin your Azure Web App publish settings, but sensitive information contained 294 | # in these scripts will be unencrypted 295 | PublishScripts/ 296 | 297 | # NuGet Packages 298 | *.nupkg 299 | # NuGet Symbol Packages 300 | *.snupkg 301 | # The packages folder can be ignored because of Package Restore 302 | **/[Pp]ackages/* 303 | # except build/, which is used as an MSBuild target. 304 | !**/[Pp]ackages/build/ 305 | # Uncomment if necessary however generally it will be regenerated when needed 306 | #!**/[Pp]ackages/repositories.config 307 | # NuGet v3's project.json files produces more ignorable files 308 | *.nuget.props 309 | *.nuget.targets 310 | 311 | # Microsoft Azure Build Output 312 | csx/ 313 | *.build.csdef 314 | 315 | # Microsoft Azure Emulator 316 | ecf/ 317 | rcf/ 318 | 319 | # Windows Store app package directories and files 320 | AppPackages/ 321 | BundleArtifacts/ 322 | Package.StoreAssociation.xml 323 | _pkginfo.txt 324 | *.appx 325 | *.appxbundle 326 | *.appxupload 327 | 328 | # Visual Studio cache files 329 | # files ending in .cache can be ignored 330 | *.[Cc]ache 331 | # but keep track of directories ending in .cache 332 | !?*.[Cc]ache/ 333 | 334 | # Others 335 | ClientBin/ 336 | ~$* 337 | *~ 338 | *.dbmdl 339 | *.dbproj.schemaview 340 | *.jfm 341 | *.pfx 342 | *.publishsettings 343 | orleans.codegen.cs 344 | 345 | # Including strong name files can present a security risk 346 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 347 | #*.snk 348 | 349 | # Since there are multiple workflows, uncomment next line to ignore bower_components 350 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 351 | #bower_components/ 352 | 353 | # RIA/Silverlight projects 354 | Generated_Code/ 355 | 356 | # Backup & report files from converting an old project file 357 | # to a newer Visual Studio version. Backup files are not needed, 358 | # because we have git ;-) 359 | _UpgradeReport_Files/ 360 | Backup*/ 361 | UpgradeLog*.XML 362 | UpgradeLog*.htm 363 | ServiceFabricBackup/ 364 | *.rptproj.bak 365 | 366 | # SQL Server files 367 | *.mdf 368 | *.ldf 369 | *.ndf 370 | 371 | # Business Intelligence projects 372 | *.rdl.data 373 | *.bim.layout 374 | *.bim_*.settings 375 | *.rptproj.rsuser 376 | *- [Bb]ackup.rdl 377 | *- [Bb]ackup ([0-9]).rdl 378 | *- [Bb]ackup ([0-9][0-9]).rdl 379 | 380 | # Microsoft Fakes 381 | FakesAssemblies/ 382 | 383 | # GhostDoc plugin setting file 384 | *.GhostDoc.xml 385 | 386 | # Node.js Tools for Visual Studio 387 | .ntvs_analysis.dat 388 | node_modules/ 389 | 390 | # Visual Studio 6 build log 391 | *.plg 392 | 393 | # Visual Studio 6 workspace options file 394 | *.opt 395 | 396 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 397 | *.vbw 398 | 399 | # Visual Studio 6 auto-generated project file (contains which files were open etc.) 400 | *.vbp 401 | 402 | # Visual Studio 6 workspace and project file (working project files containing files to include in project) 403 | *.dsw 404 | *.dsp 405 | 406 | # Visual Studio 6 technical files 407 | 408 | # Visual Studio LightSwitch build output 409 | **/*.HTMLClient/GeneratedArtifacts 410 | **/*.DesktopClient/GeneratedArtifacts 411 | **/*.DesktopClient/ModelManifest.xml 412 | **/*.Server/GeneratedArtifacts 413 | **/*.Server/ModelManifest.xml 414 | _Pvt_Extensions 415 | 416 | # Paket dependency manager 417 | .paket/paket.exe 418 | paket-files/ 419 | 420 | # FAKE - F# Make 421 | .fake/ 422 | 423 | # CodeRush personal settings 424 | .cr/personal 425 | 426 | # Python Tools for Visual Studio (PTVS) 427 | __pycache__/ 428 | *.pyc 429 | 430 | # Cake - Uncomment if you are using it 431 | # tools/** 432 | # !tools/packages.config 433 | 434 | # Tabs Studio 435 | *.tss 436 | 437 | # Telerik's JustMock configuration file 438 | *.jmconfig 439 | 440 | # BizTalk build output 441 | *.btp.cs 442 | *.btm.cs 443 | *.odx.cs 444 | *.xsd.cs 445 | 446 | # OpenCover UI analysis results 447 | OpenCover/ 448 | 449 | # Azure Stream Analytics local run output 450 | ASALocalRun/ 451 | 452 | # MSBuild Binary and Structured Log 453 | *.binlog 454 | 455 | # NVidia Nsight GPU debugger configuration file 456 | *.nvuser 457 | 458 | # MFractors (Xamarin productivity tool) working folder 459 | .mfractor/ 460 | 461 | # Local History for Visual Studio 462 | .localhistory/ 463 | 464 | # Visual Studio History (VSHistory) files 465 | .vshistory/ 466 | 467 | # BeatPulse healthcheck temp database 468 | healthchecksdb 469 | 470 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 471 | MigrationBackup/ 472 | 473 | # Ionide (cross platform F# VS Code tools) working folder 474 | .ionide/ 475 | 476 | # Fody - auto-generated XML schema 477 | FodyWeavers.xsd 478 | 479 | # VS Code files for those working on multiple tools 480 | .vscode/* 481 | !.vscode/settings.json 482 | !.vscode/tasks.json 483 | !.vscode/launch.json 484 | !.vscode/extensions.json 485 | *.code-workspace 486 | 487 | # Local History for Visual Studio Code 488 | .history/ 489 | 490 | # Windows Installer files from build outputs 491 | *.cab 492 | *.msi 493 | *.msix 494 | *.msm 495 | *.msp 496 | 497 | # JetBrains Rider 498 | *.sln.iml 499 | 500 | ### VisualStudio Patch ### 501 | # Additional files built by Visual Studio 502 | 503 | # End of https://www.toptal.com/developers/gitignore/api/visualstudio,rider,azurite,azurefunctions 504 | --------------------------------------------------------------------------------